[SCENARIO] Dungeon Adventure - the 133rd K.R.A.G.

Nicely done map system. A bit unfortunate we can't keep a world map or level map, though.
I like your texts a lot.
The only issue I have is with regards the Pillage text: "Destroy Warning Post" isn't really nice. I am sure it's possible to replace the pillage text once, so you can hide "warning post" (and wonder whether warning posts pillaging is possible by default, if so it kind of stinks). I don't know whether it's possible to have different messages depending on the tile however. If it was, it would be great to have a "Kill rats" for instance.
I also suggest keeping the current quest logged somewhere so one remembers what one must do. It's quite easy to get it done like in the regular scenarios, and I've become accustomed to this, but it's not really practical, particularly if you want to put lots of text. The event history of BtS might be a better place to put these reminders.
 
I also suggest keeping the current quest logged somewhere so one remembers what one must do. It's quite easy to get it done like in the regular scenarios, and I've become accustomed to this, but it's not really practical, particularly if you want to put lots of text. The event history of BtS might be a better place to put these reminders.

I support this idea. :P I was lost for a bit after clearing out the rats - I couldn't remember which door I was meant to take.
 
About your ScenarioSifter code:
It's needlessly complex in my opinion.

When you write: if tally >= 256:
MissionOneBotchedGarrus = 1
tally = tally - 256
You could just write:
if tally & 8:
MissionOneBotchedGarrus = 1

Furthermore, it looks like you could use a function instead of having the same code written in three places. It must be a nightmare to merge with the various patches. I initially put my code a bit everywhere in scenarioFunctions, then put everything at the end and eventually separated what I could into a different file.

For instance I use:
Code:
	def getPirateWarning( self ):
		return gc.getGame().getScenarioCounter() & 3

	def changePirateWarning( self, value ):
		gc.getGame().changeScenarioCounter( value )

	def wasIlliansCapitalTaken( self ):
		return gc.getGame().getScenarioCounter() & 4

	def getPirateIsDead( self ):
		return (gc.getGame().getScenarioCounter() & 8) != 0

	def setPirateIsDead( self ):
		if not self.getPirateIsDead():
			gc.getGame().changeScenarioCounter( 8 )
The getPirateWarning and changePirateWarning set and retrieve a value of 0,1,2 or 3, stored on the first two bits of the scenario counter. This gives me a counter so I can trigger an event 3 turns after something happened.
The wasIlliansCapitalTaken is just one bit used as a boolean, exactly the same as what you do with your tally, except you don't need compare + subtraction to do it, just "&".
I didn't check, but I think python must have some kinf of >> operators to shift the bits around if needs be, so it's possible to use the & system to check two or more bits and translate that as an int without needing to know the powers of 2 (which, being a geek, I obviously know by heart, but that's not the point).
 
.
The only issue I have is with regards the Pillage text: "Destroy Warning Post" isn't really nice.

I have complained about Warning Posts before. In my opinion, they should be a permanent feature and un-razeable. Anytime a WP needs to be removed, it can be done via a python function or whatnot. On my own computer, I changed the Improvements.XML file to toggle WPs to a permanent feature. I would have made this change for the scenario, too, but the Improvements.XML file is off limits. :(
 
@LDiCesare about the Scenario Sifter:

Um. I think you have flattered me greatly by overestimating my coding ability and familiarity with python.

I don't really know how functions work actually. I mostly tweak existing functions to get what I want.

I agree that it would make way more sense to have a separate function for the Sifter that could be called when neccessary. But that function needs to work in both the scenario.py and randomevent.py files. Plus, I don't really know how to parse the useage of such a function to pull the results of the call back into the code that needs it.

I will have to look up the "&" designator. I have no idea what it is!

Can it look at at a single integer of 192 and know that that means that "128" is toggled on, "64" is toggled on, and that "32," "16" "8" "4" "2" and "1" are toggled off?

Basically the Scenario Sifter needs to keep track of about 50 boolean states -- compressed into a single integer, which is all that is allowed in the scenario counter.

I suppose I could use a Unit Scriptdata on Gorym to store mission information instead, but I have been trying to avoid the use of scriptdata.

In any case, I would agree that the Sifter is needlessly complex, but the main advantage of the current form is that I actually understand it! :lol:
 
blarg double post.

I will note that I added the idea to limit door placement, though. That was an easy coding fix.
 
"&" == "and"

okay.

So the code examples that were given mean what, exactly? Please pretend like you are speaking to a well-meaning, but poorly trained dog.

Code:
	def getPirateWarning( self ):
		return gc.getGame().getScenarioCounter() & 3

That returns the value of the current scenario counter (SC) and 3? Does this mean the SC plus 3, or that the function is returning two separate numbers, one of which is the SC and the other 3?

Code:
	def getPirateIsDead( self ):
		return (gc.getGame().getScenarioCounter() & 8) != 0

This one I don't get. Is this function asking for a True/False? I am not following how the logic is parsing out here.

Code:
	def setPirateIsDead( self ):
		if not self.getPirateIsDead():
			gc.getGame().changeScenarioCounter( 8 )

I sort of understand this. It is saying that if the return from the getPirateIsDead function is false, then add 8 to the SC. Right?

Why does it seem that my FfH2 threads always end up doubling as python tutorials? :lol:
 
It's not your fault. :P

After doing some investigation into it, it appears patch T has unintentionally deleted those lines from the gameoptions file, which is why your scenario can't read them.

Not a bug, but still not Lute's fault. Kael must not have wound up using those in any of his scenarios like he thought he would, so deleted them. (they are also removed in the DLL, so it isn't just an oversight)
 
In python, you just write "and"

Argh!! Don't say that, "&" is python!!!! "and" too but they are different!!!! Learn the language first.

"&" is a bitwise and, while "and" is a logical and. In C++ they map respectively to "&" and "&&". They are TOTALLY different (well, except for bools).

Can it look at at a single integer of 192 and know that that means that "128" is toggled on, "64" is toggled on, and that "32," "16" "8" "4" "2" and "1" are toggled off?
Yes, using & (not and).
That's what I use:
In python, if you write 128 | 64, you get 192.
So if you have x = gc.getGame().getScenarioCounter(), if x = 192, then the following expressions give:
x & 128 gives 128
x & 64 gives 64
x & 32 gives 0...
(and for the or operator: x | 1 gives 193, x | 128 gives 192 which is x )

It's easier to understand when writing in binary.
For instance consider the figure x = 123. 123 = 64 + 32 + 16 + 8 + 2 + 1.
In binary this writes 1111011.
This means you have 7 bits used, one of them is false, the others are true.
So x & 36 in binary wrties as:
1111011 (= x = 123 )
&
0100100 ( = 36 )
gives
0100000 ( = 32 )
The result is the integer whose bits are 1 if both operands bits were 1, and 0 if there was one 0.
Yes, it's scary, but it's actually simple. You're already doing it, except you write ten times as many lines as you need.

So:
Code:
def getPirateWarning( self ):
return gc.getGame().getScenarioCounter() & 3

That returns the value of the current scenario counter (SC) and 3? Does this mean the SC plus 3, or that the function is returning two separate numbers, one of which is the SC and the other 3?
SC = SC & 3
is exactly the same as this:
if SC >= 256: SC = SC - 256
if SC >= 128: SC = SC - 128
if SC >= 64: SC = SC - 64
if SC >= 32: SC = SC - 32
if SC >= 16: SC = SC - 16
if SC >= 8: SC = SC - 8
if SC >= 4: SC = SC - 4
That is you just keep the bits worth one and 2.

Code:
def getPirateIsDead( self ):
return (gc.getGame().getScenarioCounter() & 8) != 0

This one I don't get. Is this function asking for a True/False? I am not following how the logic is parsing out here.
It's returning true/false. Without the & operator, it is the same as this:
if SC >= 256: SC = SC - 256
if SC >= 128: SC = SC - 128
if SC >= 64: SC = SC - 64
if SC >= 32: SC = SC - 32
if SC >= 16: SC = SC - 16
return SC >=8

Code:
def setPirateIsDead( self ):
if not self.getPirateIsDead():
gc.getGame().changeScenarioCounter( 8 )

I sort of understand this. It is saying that if the return from the getPirateIsDead function is false, then add 8 to the SC. Right?
Yes, but it is checking getPirateIsDead for good reason: getPirateIsDead says whether the bit for 8 is set. If it is not, it sets it to 8.
Written in binary, it says:
if SC & 1000 = 0 then SC = SC | 1000
So if you start with SC being worth 19 (=16+2+1 = 10011), it will add 8 so SC will be 27(=10111).
If I use solely >= operators, it translates as:
if SC >= 256: SC = SC - 256
if SC >= 128: SC = SC - 128
if SC >= 64: SC = SC - 64
if SC >= 32: SC = SC - 32
if SC >= 16: SC = SC - 16
if SC <8: ( = if getPirateIsDead() )
SC = SC + 8 ( =changeScenarioCounter( 8 ) )

I hope you are not disgusted by the amount of binary I wrote. The & and | operators are actually line-savers. Pity is we can't use the | or setScenarioCounter, only changeScenarioCounter.
 
Played the map, it is really well done. It would be nice if the over world map did not dissapear as you explored it, making travel a bit easier. That also fits in with other RPGs. ;) Besides that, it was just too short. I look forward to the finished product.
 
Played the map, it is really well done. It would be nice if the over world map did not dissapear as you explored it, making travel a bit easier.

Aah.. but making the overland map disappear is very cunning and allows for plot changes and side-treks. For instance, if a player chooses plot path A a city might be razed to the ground, but the player will only discover this when he passes back that way again. If they choose plot path B, the City might mobilise it's forces and you might see allied soldiers when you pass back that way. Either way you needn't necessarily learn the consequences of your actions until you pass back that way... and that's definitely a feature of RPGs.
 
Aah.. but making the overland map disappear is very cunning and allows for plot changes and side-treks. For instance, if a player chooses plot path A a city might be razed to the ground, but the player will only discover this when he passes back that way again. If they choose plot path B, the City might mobilise it's forces and you might see allied soldiers when you pass back that way. Either way you needn't necessarily learn the consequences of your actions until you pass back that way... and that's definitely a feature of RPGs.
Fog of war does that very well too. I think the problem is a technical one. It's already very clever to have developped the current mechanism. Keeping the world map in addition may be quite difficult.
 
Fog of war does that very well too. I think the problem is a technical one. It's already very clever to have developped the current mechanism. Keeping the world map in addition may be quite difficult.

Indeed! It would be possible to let the player keep the world map "explored" while on that map, but then this would have to be be completely reset each time the player entered/exited a dungeon. Otherwise, the player would start with a wierd chunk of the dungeon "pre-explored" due to the vestigal exploration from the world map. And vice-versa.

The only way to accomplish a world map (or other separate map) that stays explored would be to somehow write the map data to a file for storage -- and have it be reloaded when the player re-enters that particular map.

I actually have a preliminary system to accomplish this, but the bugs (big ones) need to be ironed out. I made the decision early on that I should focus on content for the scenario, instead of this one mechanism.

But I agree. It would be cool!
 
Fun idea. Very ambitious. I eagerly look forwards to seeing it's development. Here's my feedback.

* Might be a good idea to default the map(s) to Epic Speed to slow the chance winning a Time Victory. I wandered around Shaft X, the countryside and the Fort for a bit and got somewhere up in the 100's of turns. At a 690 turn game, I could easily see myself running out of time before the third dungeon. Alternatively, you need to make provision for the time victory.

* Giving the heroes the Bounty Hunter option would grant them gold upon beating bad guys and would be thematically correct for the 133rd KRAG.

* I don't know if you're allowed to hack the promotions for the scenario contest, but you could have two promotions Dungeoneering I and Dungeoneering II which granted +1 move in Dungeons only. This would allow players to collect the Mobility promotion for themselves, but would still give you a swicth for bonus movement in dungeons.

* I loved the gags about killing rats and not going East, but the latter might spoil the dark fantasy atmosphere to some extent. Narratively speaking you could just say that the central protagonist isn't trusted enough yet to prevent him from going through unnecessary doors in Shaft X.

* Not to sure about the scenario name either. Tales from Shaft X sounds more dramatic (or like some kind of dodgy porn movie, you decide)

* Downloading and setting up was a bit annoying. Might be better to provide an Assets_DA.zip folder instead.
 
* Might be a good idea to default the map(s) to Epic Speed to slow the chance winning a Time Victory. I wandered around Shaft X, the countryside and the Fort for a bit and got somewhere up in the 100's of turns. At a 690 turn game, I could easily see myself running out of time before the third dungeon. Alternatively, you need to make provision for the time victory.

Good observation! For now, I changed the turn limit to 10,000.

* Giving the heroes the Bounty Hunter option would grant them gold upon beating bad guys and would be thematically correct for the 133rd KRAG.

This promotion will be available once Gorym chooses a class.

* I don't know if you're allowed to hack the promotions for the scenario contest, but you could have two promotions Dungeoneering I and Dungeoneering II which granted +1 move in Dungeons only. This would allow players to collect the Mobility promotion for themselves, but would still give you a swicth for bonus movement in dungeons.

We cannot alter the promotions XML file. I am still playing around with ideas, though. I would like players to be able to take all of the usual promotions as normal, but it may not be possible to acheive that desired effect. EDIT: I switched to using the starting_settler promotion for indoors. It gives extra visibility and movement, and the player can still use the mobility and sentry promotions, if desired!

* I loved the gags about killing rats and not going East, but the latter might spoil the dark fantasy atmosphere to some extent. Narratively speaking you could just say that the central protagonist isn't trusted enough yet to prevent him from going through unnecessary doors in Shaft X.

Yah... consider the dark fantasy atmosphere ruined. ;) I figure this is my one shot to get the horrible jokes out of my system!

* Not to sure about the scenario name either. Tales from Shaft X sounds more dramatic (or like some kind of dodgy porn movie, you decide).

The title is just a placeholder, and I am very open to suggestions! But "Tales from Shaft X" does sound unfortunately like porn, though.

* Downloading and setting up was a bit annoying. Might be better to provide an Assets_DA.zip folder instead.

I think that can be arranged! :D Do you mean to have the zip contain the exact same stuff and in the same format, but to just rename the zip "assets_DA?"
 
Hey, awesome start.

It would be good if you could add a new skill like mapping or orientering which allowed you to keep a larger FOW area in the mini map. I'm not saying the whole map should be ther but it would be good if there was a bit more.

To expand on this, not necessarily for this scenario, it would be cool to be able to enter city/towns like the dungeons and walk up to shops, get information and quests.

Can you add information to the quest TAB? this would be handy to review the key points of conversations and the mission at hand. It means you can provide information but not give the answer so the outcome would depend on how th player interprets the info.

I really enjoy the idea of having 1 hero (You) and being able to grow that party (not greatly) 2-3 main units (individuals that join your party) and maybe 2-3 mercenaries (of varied types, archer, swordsman, axeman etc), with an upkeep of course. This way the party would vary from place to place, mission to mission, adventure to adventure, quest to quest... But the party should be restricted to maybe 3 plot distance from you else you loose them (you got split from your party and don't know where to find them). if they are key to the quest they can be found later.

Maybe adding food rashers and a turn requirement, or maybe just factor this into some upkeep. 5gold per 10 turns or something.

Is it possible to have pieces of armour, shields, swords, rings, etc... worn at the same time? Can you carry a pack?

Maybe I am over complicating it but I can see what you have currently and believe there is a lot that can be done to enhance the D&D feel. :)
 
1. Fixed an error in the Scenario Sifter that was causing odd errors inside dungeons. (I accidentally had a bunch of "=="s in place of "="s!)
2. Merchant events are partly done. This is a series of chained events that let you buy and sell stuff from Bortas the Outfitter.
3. Ad hoc prospecting/mining now possible in dungeons.
 
hey Lutefisk, i just gave your scenario a whirl and i must say im impressed with how youve done so far. it ran perfectly smoothly and i didnt encounter any bugs.

just a few comments:
-it would be nice if you could actually 'fight' the rats, instead of just standing on them.
-i know graphics are not aloud to be touched for the scenario design contest, but i hope that you continue this idea further whether you win or not and add graphics. id like to volunteer my services in that department (particularly with staircases :p)
-do you have any plans to create an invintory screen in the future?
- i love the text, and i had a good chuckle at a few of the jokes :lol: this mod needed a touch more humour :p thanks :D

i look forward to the full version!
 
Update on progress for next release:

1. Merchant events are now complete. Basic buying and selling is in! Next I will work on the Priest buy/sell events.

2. NPCs in Shaft X will be automatically HELD if you end a turn within 1 plot of them. Once you move out of range, they move about normally. This reduces the occurance of annoying multi-turn chases to talk to an NPC.
 
Back
Top Bottom