From e14cbed11694cde3a114a18a6681f336fb90db41 Mon Sep 17 00:00:00 2001 From: jwvhewitt Date: Mon, 2 Sep 2024 00:20:53 +0900 Subject: [PATCH] Added decor for more buildings; counters to most shops. --- game/content/gharchitecture.py | 42 +++++++++++-- game/content/ghplots/bbmc_main.py | 17 ++++++ game/content/ghplots/dd_homebase.py | 27 +++++++-- game/content/ghplots/dd_roadstops.py | 7 ++- game/content/ghplots/missionbuilder.py | 6 +- game/content/ghplots/mocha.py | 34 ++++++++++- game/content/ghplots/shops_plus.py | 64 +++++++++++++++++--- game/content/ghrooms.py | 11 +++- game/content/ghterrain.py | 36 +++++++++++ game/content/megaprops.py | 7 ++- history.md | 2 + image/prop_ferry.png | Bin 0 -> 2618 bytes image/terrain_decor_armorcabinet.png | Bin 0 -> 5061 bytes image/terrain_decor_armormannequin.png | Bin 0 -> 3243 bytes image/terrain_decor_loungetable.png | Bin 0 -> 4069 bytes image/terrain_gervais_decor_provisions.png | Bin 0 -> 3561 bytes image/terrain_gervais_decor_weaponracks.png | Bin 0 -> 3971 bytes image/terrain_swall_shopcounter.png | Bin 0 -> 4491 bytes main.py | 11 +--- pbge/randmaps/rooms.py | 2 + pbge/scenes/terrain.py | 1 + 21 files changed, 229 insertions(+), 38 deletions(-) create mode 100644 image/prop_ferry.png create mode 100644 image/terrain_decor_armorcabinet.png create mode 100644 image/terrain_decor_armormannequin.png create mode 100644 image/terrain_decor_loungetable.png create mode 100644 image/terrain_gervais_decor_provisions.png create mode 100644 image/terrain_gervais_decor_weaponracks.png create mode 100644 image/terrain_swall_shopcounter.png diff --git a/game/content/gharchitecture.py b/game/content/gharchitecture.py index f01394b6..610c6e7e 100644 --- a/game/content/gharchitecture.py +++ b/game/content/gharchitecture.py @@ -10,10 +10,6 @@ import random -class CheeseShopDecor(OmniDec): - WALL_DECOR = (ghterrain.WoodenShelves,) - - class ResidentialDecor(OmniDec): WALL_DECOR = (ghterrain.WoodenShelves,) WIN_DECOR = ghterrain.ScreenWindow @@ -26,6 +22,44 @@ class RestaurantDecor(OmniDec): FLOOR_FILL_FACTOR = 0.05 +class BreakRoomDecor(OmniDec): + WALL_DECOR = (ghterrain.LoungeTableTerrain,) + WALL_FILL_FACTOR = 0.33 + FLOOR_DECOR = (ghterrain.TableAndChairsTerrain,) + FLOOR_FILL_FACTOR = 0.05 + + +class WeaponShopDecor(OmniDec): + WALL_DECOR = (ghterrain.GervaisWeaponRacks,) + + +class ArmorShopDecor(OmniDec): + WALL_DECOR = (ghterrain.ArmorCabinetTerrain, ghterrain.ArmorMannequinTerrain) + + +class ArmoryDecor(OmniDec): + WALL_DECOR = ( + ghterrain.GervaisWeaponRacks, ghterrain.ArmorCabinetTerrain, ghterrain.ArmorMannequinTerrain + ) + + +class CheeseShopDecor(OmniDec): + WALL_DECOR = (ghterrain.WoodenShelves, ghterrain.ProvisionsTerrain) + + +class GeneralShopDecor(OmniDec): + WALL_DECOR = ( + ghterrain.GervaisWeaponRacks, ghterrain.ArmorCabinetTerrain, ghterrain.WoodenShelves, ghterrain.ProvisionsTerrain + ) + + +class BlackMarketDecor(OmniDec): + WALL_DECOR = ( + ghterrain.GervaisWeaponRacks, ghterrain.ArmorCabinetTerrain, ghterrain.ArmorMannequinTerrain, + ghterrain.ShippingShelvesTerrain, ghterrain.JollyRogerSign + ) + + class DungeonDecor(OmniDec): WALL_DECOR = (ghterrain.TorchTerrain,) WALL_FILL_FACTOR = 0.33 diff --git a/game/content/ghplots/bbmc_main.py b/game/content/ghplots/bbmc_main.py index 4c19e560..d81843b9 100644 --- a/game/content/ghplots/bbmc_main.py +++ b/game/content/ghplots/bbmc_main.py @@ -1466,6 +1466,23 @@ def NPC_offers(self, camp): allow_generics=False )) + elif gears.tags.Criminal in camp.pc.get_tags(): + mylist.append(Offer( + "Hey, I know you! You're [audience]! Last I heard the Guardians put a bounty of ${:,} on your head. So are you still doing crimes, or have you decided to go straight like me?".format(gears.selector.calc_mission_reward(camp.pc.renown, 200, True)), + ContextTag([context.HELLO]), effect=self._have_first_conversation, allow_generics=False + )) + mylist.append(Offer( + "Hah! You may be right, you may be... Why don't you take a look at the scenery around this park and see if there's anything you can pocket? Just walk over and bump into stuff, same as you did for me.", + ContextTag([context.CUSTOM]), + data={"reply": "Still doing crimes. And I'll believe you've gone straight when I see it!"}, allow_generics=False + )) + mylist.append(Offer( + "Seriously? You know, the Cavalier Code don't say anything about breaking the law... I'd be at it myself if there wasn't better money in teaching. Which brings me to your first lesson: take a look at the things in this park. Just walk over and bump into 'em, like you did for me.", + ContextTag([context.CUSTOM]), + data={"reply": "I'm a cavalier now. I've left that behind."}, + allow_generics=False + )) + else: mylist.append(Offer( "Good job, you can move around and interact with other people. You're going to be doing a whole lot of that as a cavalier.", diff --git a/game/content/ghplots/dd_homebase.py b/game/content/ghplots/dd_homebase.py index 8c5a85ca..29af5f44 100644 --- a/game/content/ghplots/dd_homebase.py +++ b/game/content/ghplots/dd_homebase.py @@ -71,6 +71,7 @@ def custom_init(self, nart): # tplot = self.add_sub_plot(nart, "TEST_DUNGEON") # tplot = self.add_sub_plot(nart, "TEST_CHAR_MOVER") self.add_sub_plot(nart, "DZD_BLACK_ISLE_PUB") + self.add_sub_plot(nart, "RANDOM_SHOP") # Hwang-Sa Mission # Reconstruction Site tplot = self.add_sub_plot(nart, "QOL_REPORTER") @@ -1146,10 +1147,15 @@ def custom_init(self, nart): room2=foyer, door1=building.waypoints["OTHER"], move_door1=False) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + npc = self.register_element("SHOPKEEPER", gears.selector.random_character(50, local_tags=self.elements["LOCALE"].attributes, job=gears.jobs.ALL_JOBS["Shopkeeper"])) - team2.contents.append(npc) + salesteam.contents.append(npc) self.shop = services.Shop(npc=npc, rank=50) @@ -1321,11 +1327,17 @@ def custom_init(self, nart): room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) + + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + npc = self.register_element("SHOPKEEPER", gears.selector.random_character(50, local_tags=self.elements["LOCALE"].attributes, job=gears.jobs.ALL_JOBS["Shopkeeper"], combatant=False)) - npc.place(intscene, team=team2) + npc.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc, ware_types=services.TIRE_STORE) @@ -1375,7 +1387,7 @@ def custom_init(self, nart): intscenegen = pbge.randmaps.SceneGenerator(intscene, game.content.gharchitecture.CommercialBuilding()) self.register_scene(nart, intscene, intscenegen, ident="INTERIOR", dident="LOCALE") foyer = self.register_element('_introom', pbge.randmaps.rooms.ClosedRoom(anchor=pbge.randmaps.anchors.south, - decorate=game.content.gharchitecture.CheeseShopDecor()), + decorate=game.content.gharchitecture.ArmoryDecor()), dident="INTERIOR") mycon2 = game.content.plotutility.TownBuildingConnection(nart, self, self.elements["LOCALE"], intscene, @@ -1383,10 +1395,15 @@ def custom_init(self, nart): room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + npc = self.register_element("SHOPKEEPER", gears.selector.random_character(50, local_tags=self.elements["LOCALE"].attributes, job=gears.jobs.ALL_JOBS["Shopkeeper"])) - npc.place(intscene, team=team2) + npc.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc, rank=50, ware_types=services.GENERAL_STORE) @@ -1788,7 +1805,7 @@ def REGEXNPC_offers(self, camp): )) mylist.append(Offer( - "That would be great. More work will help us to rebuild our office faster, and I for one can't wait to get out of this building. It alway`s smells like coffee and magnetic grease in here.", + "That would be great. More work will help us to rebuild our office faster, and I for one can't wait to get out of this building. It always smells like coffee and magnetic grease in here.", context=ContextTag([context.CUSTOMREPLY]), subject=self, data={"reply": "I'll see what I can do about that."}, effect=self._tell_about_services )) diff --git a/game/content/ghplots/dd_roadstops.py b/game/content/ghplots/dd_roadstops.py index b3efba61..8384006e 100644 --- a/game/content/ghplots/dd_roadstops.py +++ b/game/content/ghplots/dd_roadstops.py @@ -1267,7 +1267,12 @@ def custom_init(self, nart): room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) - npc1.place(intscene, team=team2) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + + npc1.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc1, ware_types=services.GENERAL_STORE) diff --git a/game/content/ghplots/missionbuilder.py b/game/content/ghplots/missionbuilder.py index 3c0cc75c..c55ec630 100644 --- a/game/content/ghplots/missionbuilder.py +++ b/game/content/ghplots/missionbuilder.py @@ -435,9 +435,9 @@ def _generate_entrance_room(self): self.elements["ENTRANCE_ANCHOR"] = myanchor myscene: gears.GearHeadScene = self.elements["LOCALE"] if myanchor in (pbge.randmaps.anchors.east, pbge.randmaps.anchors.west): - corridor = pbge.randmaps.rooms.OpenRoom(width=myscene.width, height=14, anchor=pbge.randmaps.anchors.west) + corridor = pbge.randmaps.rooms.OpenRoom(width=myscene.width, height=15, anchor=pbge.randmaps.anchors.west) else: - corridor = pbge.randmaps.rooms.OpenRoom(width=14, height=myscene.height, anchor=pbge.randmaps.anchors.north) + corridor = pbge.randmaps.rooms.OpenRoom(width=15, height=myscene.height, anchor=pbge.randmaps.anchors.north) self.register_element("ESCORT_PATH", corridor, dident="LOCALE") interior_anchors = list(pbge.randmaps.anchors.ADJACENT_ANCHORS[myanchor]) random.shuffle(interior_anchors) @@ -445,7 +445,7 @@ def _generate_entrance_room(self): self.register_element("_ENTRANCE", game.content.ghwaypoints.Exit(anchor=pbge.randmaps.anchors.middle, plot_locked=True), dident="ENTRANCE_ROOM") - self.register_element("ESCORT_ROOM", pbge.randmaps.rooms.OpenRoom(7, 7, anchor=interior_anchors[1]), dident="ESCORT_PATH") + self.register_element("ESCORT_ROOM", pbge.randmaps.rooms.OpenRoom(8, 8, anchor=interior_anchors[1]), dident="ESCORT_PATH") # **************************** diff --git a/game/content/ghplots/mocha.py b/game/content/ghplots/mocha.py index 95715f00..b9708ed7 100644 --- a/game/content/ghplots/mocha.py +++ b/game/content/ghplots/mocha.py @@ -330,6 +330,8 @@ def custom_init(self, nart): sp = self.add_sub_plot(nart, "MOCHA_CARTER") self.elements["CARTER"] = sp.elements["CARTER"] + #self.add_sub_plot(nart, "MOCHA_ONAWA") + # Add the puzzle to get through the snowdrift. # # Bibliography for procedural puzzle generation: @@ -559,7 +561,8 @@ def custom_init(self, nart): intscene = gears.GearHeadScene( 50, 35, "Mauna Chalet", player_team=team1, civilian_team=team2, attributes=(gears.tags.SCENE_PUBLIC, gears.tags.SCENE_BUILDING, gears.tags.SCENE_MEETING), - scale=gears.scale.HumanScale + scale=gears.scale.HumanScale, + exploration_music='Doctor_Turtle_-_04_-_Lets_Just_Get_Through_Christmas.ogg', ) intscenegen = pbge.randmaps.PackedBuildingGenerator( @@ -569,11 +572,13 @@ def custom_init(self, nart): foyer = self.register_element('_introom', pbge.randmaps.rooms.ClosedRoom(width=random.randint(10,15), height=random.randint(6,8), - anchor=pbge.randmaps.anchors.south,), + anchor=pbge.randmaps.anchors.south, + decorate=gharchitecture.BreakRoomDecor()), dident="LOCALE") foyer.contents.append(team2) self.register_element("ENTRANCE", ghwaypoints.Waypoint(anchor=pbge.randmaps.anchors.middle), dident="_introom") + self.register_element("POSTER", ghwaypoints.MechaPoster(name="Poster", desc="A promotional poster for the charity mecha tournament.", plot_locked=True), dident="_introom") self.register_element("EXIT", ghwaypoints.Exit(name="Exit", anchor=pbge.randmaps.anchors.south, plot_locked=True), dident="_introom") @@ -733,6 +738,31 @@ def CARTER_offers(self, camp): return mylist +class WinterMochaOnawa(Plot): + LABEL = "MOCHA_ONAWA" + active = True + scope = "LOCALE" + + did_greeting = False + + def custom_init(self, nart): + myscene = self.elements["LOCALE"] + hyolee = nart.camp.get_major_npc("Onawa GH1") + hyolee.mmode = pbge.scenes.movement.Walking + self.register_element("NPC", hyolee, dident="ROOM") + self.asked_join = False + return True + + def NPC_offers(self, camp): + # Return list of dialogue offers. + mylist = list() + mylist.append(Offer("Centuries of technological development and nobody has found a better use for computers than turn based gaming. They have played us for fools...", + context=ContextTag([context.CUSTOM]), data={'reply': 'Say the line, please.'}, + effect=None, no_repeats=True, dead_end=True)) + + return mylist + + class WinterMochaHyolee(Plot): LABEL = "MOCHA_HYOLEE" active = True diff --git a/game/content/ghplots/shops_plus.py b/game/content/ghplots/shops_plus.py index e5b7504f..501ec299 100644 --- a/game/content/ghplots/shops_plus.py +++ b/game/content/ghplots/shops_plus.py @@ -136,6 +136,30 @@ def custom_init(self, nart): return True +# ********************* +# *** RANDOM_SHOP *** +# ********************* +# +# To spice up a random place, add a random shop. +# Elements: +# LOCALE +# Optional: +# CITY_COLORS +# + +class RandomShop(Plot): + LABEL = "RANDOM_SHOP" + + SHOP_TYPES = ( + "SHOP_ARMORSTORE", "SHOP_WEAPONSTORE", "SHOP_MECHA", + "SHOP_BLACKMARKET", "SHOP_GENERALSTORE", "SHOP_TAVERN" + ) + + def custom_init(self, nart): + self.add_sub_plot(nart, random.choice(self.SHOP_TYPES)) + return True + + # ************************* # *** SHOP_ARMORSTORE *** # ************************* @@ -186,14 +210,22 @@ def custom_init(self, nart): intscenegen = pbge.randmaps.SceneGenerator(intscene, gharchitecture.CommercialBuilding()) self.register_scene(nart, intscene, intscenegen, ident="INTERIOR", dident="LOCALE") - foyer = self.register_element('FOYER', pbge.randmaps.rooms.ClosedRoom(random.randint(10,15), random.randint(10,15), anchor=pbge.randmaps.anchors.south), + foyer = self.register_element('FOYER', pbge.randmaps.rooms.ClosedRoom( + random.randint(10,15), random.randint(10,15), anchor=pbge.randmaps.anchors.south, + decorate=gharchitecture.ArmorShopDecor() + ), dident="INTERIOR") mycon2 = plotutility.TownBuildingConnection( nart, self, self.elements["LOCALE"], intscene, room1=building, room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) - npc1.place(intscene, team=team2) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + + npc1.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc1, ware_types=services.ARMOR_STORE, rank=self.rank + random.randint(0, 15), shop_faction=self.elements.get("SHOP_FACTION")) @@ -270,15 +302,21 @@ def custom_init(self, nart): intscenegen = pbge.randmaps.SceneGenerator(intscene, gharchitecture.CommercialBuilding()) self.register_scene(nart, intscene, intscenegen, ident="INTERIOR", dident="LOCALE") - foyer = self.register_element('FOYER', pbge.randmaps.rooms.ClosedRoom(random.randint(10,15), random.randint(10,15), anchor=pbge.randmaps.anchors.south, - decorate=gharchitecture.CheeseShopDecor()), - dident="INTERIOR") + foyer = self.register_element('FOYER', pbge.randmaps.rooms.ClosedRoom( + random.randint(10,15), random.randint(10,15), anchor=pbge.randmaps.anchors.south, + decorate=gharchitecture.ArmoryDecor() + ), dident="INTERIOR") mycon2 = plotutility.TownBuildingConnection( nart, self, self.elements["LOCALE"], intscene, room1=building, room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) - npc1.place(intscene, team=team2) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + + npc1.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc1, ware_types=services.BLACK_MARKET, rank=self.rank + 25, shop_faction=self.elements.get("SHOP_FACTION"), buy_stolen_items=True) @@ -569,7 +607,12 @@ def custom_init(self, nart): nart, self, self.elements["LOCALE"], intscene, room1=building, room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) - npc1.place(intscene, team=team2) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + + npc1.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc1, ware_types=services.GENERAL_STORE, rank=self.rank + random.randint(0, 15), shop_faction=self.elements.get("SHOP_FACTION")) @@ -934,7 +977,12 @@ def custom_init(self, nart): nart, self, self.elements["LOCALE"], intscene, room1=building, room2=foyer, door1=building.waypoints["DOOR"], move_door1=False) - npc1.place(intscene, team=team2) + mycounter = ghrooms.ShopCounterArea(random.randint(4, 6), random.randint(3, 5), anchor=pbge.randmaps.anchors.north) + foyer.contents.append(mycounter) + salesteam = self.register_element("SALES_TEAM", teams.Team(name="Sales Team", allies=[team2])) + mycounter.contents.append(salesteam) + + npc1.place(intscene, team=salesteam) self.shop = services.Shop(npc=npc1, ware_types=services.WEAPON_STORE, rank=self.rank + random.randint(0, 15), shop_faction=self.elements.get("SHOP_FACTION")) diff --git a/game/content/ghrooms.py b/game/content/ghrooms.py index 9702e0e1..05116fc2 100644 --- a/game/content/ghrooms.py +++ b/game/content/ghrooms.py @@ -113,19 +113,24 @@ def build(self, gb, archi): class BarArea(OpenRoom): + COUNTER_TYPE = ghterrain.BarTerrain def build(self, gb, archi): super().build(gb, archi) # Add a bar along the south and maybe along one side. mydest = pygame.Rect(self.area.left, self.area.bottom - 1, self.area.width, 1) - gb.fill(mydest, wall=ghterrain.BarTerrain) + gb.fill(mydest, wall=self.COUNTER_TYPE) if random.randint(1, 3) == 1: mydest = pygame.Rect(self.area.left, self.area.top, 1, self.area.height) - gb.fill(mydest, wall=ghterrain.BarTerrain) + gb.fill(mydest, wall=self.COUNTER_TYPE) elif random.randint(1, 2) == 1: mydest = pygame.Rect(self.area.right, self.area.top, 1, self.area.height) - gb.fill(mydest, wall=ghterrain.BarTerrain) + gb.fill(mydest, wall=self.COUNTER_TYPE) + + +class ShopCounterArea(BarArea): + COUNTER_TYPE = ghterrain.ShopCounterTerrain class LongVehicleRoom(pbge.randmaps.rooms.Room): diff --git a/game/content/ghterrain.py b/game/content/ghterrain.py index 41117219..654ed8ae 100644 --- a/game/content/ghterrain.py +++ b/game/content/ghterrain.py @@ -487,6 +487,26 @@ class WoodenShelves(pbge.scenes.terrain.OnTheWallVariableTerrain): east_frames = (0, 2, 4, 6, 8) +class GervaisWeaponRacks(pbge.scenes.terrain.OnTheWallVariableTerrain): + image_top = 'terrain_gervais_decor_weaponracks.png' + south_frames = (1, 3, 5, 7, 9) + east_frames = (0, 2, 4, 6, 8) + + +class ArmorCabinetTerrain(pbge.scenes.terrain.OnTheWallTerrain): + image_top = 'terrain_decor_armorcabinet.png' + + +class ArmorMannequinTerrain(pbge.scenes.terrain.OnTheWallTerrain): + image_top = 'terrain_decor_armormannequin.png' + + +class ProvisionsTerrain(pbge.scenes.terrain.OnTheWallVariableTerrain): + image_top = 'terrain_gervais_decor_provisions.png' + south_frames = (1, 3) + east_frames = (0, 2) + + class StatueMTerrain(pbge.scenes.terrain.OnTheWallTerrain): image_top = 'terrain_decor_statue_m.png' @@ -1211,6 +1231,12 @@ class ShippingShelvesTerrain(pbge.scenes.terrain.OnTheWallVariableTerrain): east_frames = (0, 2, 4, 6) +class LoungeTableTerrain(pbge.scenes.terrain.OnTheWallVariableTerrain): + image_top = 'terrain_decor_loungetable.png' + south_frames = (1, 3, 5, 7) + east_frames = (0, 2, 4, 6) + + class NorthSouthShelvesTerrain(pbge.scenes.terrain.VariableTerrain): image_top = 'terrain_decor_nsshelves.png' blocks = (Walking, Skimming, Rolling, Flying) @@ -1478,6 +1504,16 @@ class BarTerrain(pbge.scenes.terrain.WallTerrain): altitude = 0 blocks = (Walking, Skimming, Rolling) movement_cost = {pbge.scenes.movement.Vision: 5} + TAKES_WALL_DECOR = False + + +class ShopCounterTerrain(pbge.scenes.terrain.WallTerrain): + image_top = 'terrain_swall_shopcounter.png' + bordername = None + altitude = 0 + blocks = (Walking, Skimming, Rolling) + movement_cost = {pbge.scenes.movement.Vision: 5} + TAKES_WALL_DECOR = False class AngelEggTerrain(pbge.scenes.terrain.Terrain): diff --git a/game/content/megaprops.py b/game/content/megaprops.py index dd5e140c..d4958929 100644 --- a/game/content/megaprops.py +++ b/game/content/megaprops.py @@ -81,13 +81,14 @@ def deal_with_collisions(self, camp, collisions): class CivilianWaterShip(MegaProp): - POSITIONS = ((0,0), (0,1), (0,-1), (0,2), (0,-2)) + POSITIONS = ((2,0), (1,0), (0,0), (-1,0), (-2, 0), (-3, 0)) + FRAMES = (4,6,5) def __init__(self, *args, rank=50, **kwargs): super().__init__(*args, **kwargs) self.rank = rank size = max(min(rank//10 + 1, 10), 2) length = max(min(rank//20 + 1, 5), 2) - for t in range(length): - self.contents.append(gears.base.Prop(size=size, name="Ship", imagename="prop_block.png", altitude=0)) + for t in range(3): + self.contents.append(gears.base.Prop(size=size, name="Ship", imagename="prop_ferry.png", altitude=0, frame=self.FRAMES[t])) #print(MegaProp._generate_spiral(20)) diff --git a/history.md b/history.md index 6a02e76c..9ec02e31 100644 --- a/history.md +++ b/history.md @@ -1,3 +1,5 @@ +* Wall terrain types can be marked to not accept wall decor +* Added extra dialogue to Bear Bastard's Mecha Camp for Criminal PCs * PlacableThing's altitude property now does something * Combat can be set to keep going even if there are no active enemies on map * Room contents with fixed positions will now be placed on map diff --git a/image/prop_ferry.png b/image/prop_ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..12056fcc875eead092178681ce31fa649317df9f GIT binary patch literal 2618 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 literal 0 HcmV?d00001 diff --git a/image/terrain_decor_armormannequin.png b/image/terrain_decor_armormannequin.png new file mode 100644 index 0000000000000000000000000000000000000000..15665a9a63f0d45a603b2cd64da5f850e96e79a8 GIT binary patch literal 3243 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 literal 0 HcmV?d00001 diff --git a/image/terrain_gervais_decor_provisions.png b/image/terrain_gervais_decor_provisions.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9c4e19ef4d9f23b1db07d9d85765c72d0772aa GIT binary patch literal 3561 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 L-05Mnq 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 bTPgaPUGmU%C)gK3hCN^gvofx`;hFS*xJy}^ literal 0 HcmV?d00001 diff --git a/image/terrain_swall_shopcounter.png b/image/terrain_swall_shopcounter.png new file mode 100644 index 0000000000000000000000000000000000000000..aa421d7a47422370afc03115fb36bb9964980181 GIT binary patch literal 4491 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