July 16, 2002, 13:55
|
#1
|
Prince
Local Time: 04:26
Local Date: November 1, 2010
Join Date: Nov 2001
Posts: 437
|
Limits of modding
I'm trying to get a sense of the limits to the ability to mod CTP2 and have a few questions:
1) can you make government types that expire? Meaning can you make it so that a civilization cannot have a "city-state" government after the discovery of a certain advance (giving a new government type, for instance) or after a certain date in the game?
2) Is there an equivalent to the events.txt in Civ II? so that you could tell the game/scenario: on x turn, [DoSomething1] happens?
3) In a scenario, could you edit the territory borders around a city?
Thanks in advance.
|
|
|
|
July 16, 2002, 19:59
|
#2
|
King
Local Time: 04:26
Local Date: November 1, 2010
Join Date: Jan 2000
Location: Gone Fishin, Canada
Posts: 1,059
|
Quote:
|
2) Is there an equivalent to the events.txt in Civ II? so that you could tell the game/scenario: on x turn, [DoSomething1] happens?
|
I'll try to answer this one. In Civ2 you could have:
Code:
|
@IF
CityTaken
city=New York
attacker=English
defender=Americans
@THEN
Text
New York captured by the Redcoats! Enraged local citizens join the fight for liberty!
EndText
CreateUnit
unit=Militia
owner=Americans
veteran=false
homecity=none
locations
84,22
84,23
79,31
endlocations
@ENDIF |
In CTP2 this could be done, pretty well literally, as:
Code:
|
HandleEvent(CaptureCity) 'SampleHandler' pre {
if (PlayerCivilization(player[0]) == CivilizationIndex("English")
&& PlayerCivilization(city[0].owner) == CivilizationIndex("American")
&& city[0].location==NewYorkLoc ){
message(city[0].owner,'NewYorkCaptured');
event:CreateUnit(city[0].owner,UnitDB(UNIT_MILITIA),SpawnRebelsLoc,0);
}
}
messagebox 'NewYorkCaptured' {
Show();
Text (ID_NewYorkCapturedMessage);
// NewYorkCapturedMessage "New York captured by the Redcoats!
// Enraged local citizens join the fight for liberty!"
} |
where:
i) NewYorkLoc is a (global) location variable that you've set to be New York's location,
ii) SpawnRebelsLoc is a (global) location variable that you've set to be the place where you want the Militia to appear,
and,
iii) the outcommented lines appear in the .txt file that you're using to save your text in.
The "CaptureCity" event occurs whenever a city is captured: player[0] is the capturing player and city[0] is the city (so city[0].owner is it's owner and city[0].location is it's location).
The only thing I've left out is a mechanism to check that SpawnRebelsLoc is a valid location to create a new unit on. There's more than one way to do this and no point on going off on a tangent.
Although I haven't looked into it in detail (the above is just the example on p32 of the Conflicts in Civilization Instruction Manual) it would appear to be a very straightforward matter to convert any of your existing triggers into SLIC.
(What would be very very tedious would be making the maps and units and all that kind of stuff.)
But anyway, SLIC is FAR more powerful than the triggers mechanism of Civ2. For one thing, the latter had seven events: CityTaken, Negotiation, RandomTurn, ScenarioLoaded, Turn, TurnInterval, and UnitKilled. SLIC has something like 238 events (if I counted them right, they're not numbered). Not all of them are interesting, nor even all that usable, but each of them is a 'hook' into the executable: they (and the ones in Civ2 for that matter) allow you to change the actual game's program.
'Actions' Once you've set your hook, Civ2 gave you 9 types of 'action' that you can perform: ChangeMoney, CreateUnit, DontPlayWonders, JustOnce, MakeAgression, MoveUnit, PlayCDTrack, PlayWaveFile, and Text/EndText. With SLIC what corresponds to an action is just any acceptable block of SLIC code. From this point of view there are literally infinitely many types of SLIC 'actions' because as a proper scripting language SLIC has all sorts of resources that enable you to specify what it is that you want the computer to do.
For example, in Civ3 you can get 'Generals'. But, on the one hand, I've read complaints that you don't get enough of them, and on the other, big deal: Immortal Wombat had already implemented a similar idea in Cradle before Civ3 was released. Hexagonian describes it as follows:
Quote:
|
There is also a set of Wonder Units that are tied into the creation of certain Wonders. I tried to align them to a theme within the Wonder - hence the selection of certain leaders. They will grant veteran status to any units underneath them. They also operate as ranged units, so they will not be sitting on the front lines taking the early hits - and are generally stronger than their counterparts. There is a happiness penalty if the unit is disbanded or lost.
|
To do this, Immortal Wombat wrote a whole bunch of little handlers: a pair for each of the special Wonder units. Here's the pair for Hammurabi with my comments trying to explain what each line is doing:
Code:
|
HandleEvent(CreateWonder) 'Hammurabi' post {//this triggers whenever a Wonder is created
tmpWonder = value[0];//set tmpWonder equal to the Data Base value of the Wonder that was just created
if(tmpWonder == WonderDB(WONDER_CODE_OF_HAMMURABI)) {//if this wonder was the CODE_OF_HAMMURABI
tmpCity = city[0]; // set tmpCity equal to the city the wonder was created in
tmpPlayer = tmpCity.owner;//and tmpPlayer equal to the owner of that city
CreateUnit(tmpPlayer, UnitDB(UNIT_HAMMURABI), city[0].location, 0);//give HAMMURABI to tmpPlayer in the city
DisableTrigger('Hammurabi');//do this once, i.e., only allow one HAMMURABI unit to be created
}
}
HandleEvent(BeginTurn) 'UnhappinessChecker1' pre {
foundHim = 0;//set foundHim to false
if(PlayerHasWonder(Player[0], WonderDB(WONDER_CODE_OF_HAMMURABI))) {
//if the player whose turn is beginning has the CODE_OF_HAMMURABI Wonder
for(i = 0; i < player[0].units; i = i + 1) {// look through his units
GetUnitByIndex(player[0], i, tmpUnit);// "
if(tmpUnit.type == UnitDB(UNIT_HAMMURABI)) {//if one of them is HAMMURABI
foundHim = 1; //set foundHim to true
}
}
if (!foundHim) {//if we didn't find him (i.e. he just got killed or disbanded)
for(j = 0; j < player[0].cities; j = j + 1) {//look through his cities
GetCityByIndex(player[0], j, tmpCity); // "
Event:AddHappyTimer(tmpCity, 3, -1, 12);// and make each of them unhappy
DisableTrigger('UnhappinessChecker1'); // do this once, i.e. just when HAMMURABI is
// killed/disbanded
}
}
}
} |
Details aside, the real point here is to notice the incredible flexibility of what you can do with SLIC.
|
|
|
|
July 17, 2002, 00:03
|
#3
|
King
Local Time: 01:26
Local Date: November 1, 2010
Join Date: Jul 2001
Location: of Natal, Brazil
Posts: 2,555
|
Re: Limits of modding
Quote:
|
Originally posted by ahenobarb
I'm trying to get a sense of the limits to the ability to mod CTP2 and have a few questions:
1) can you make government types that expire? Meaning can you make it so that a civilization cannot have a "city-state" government after the discovery of a certain advance (giving a new government type, for instance) or after a certain date in the game?
|
I've heard that you can add the line ObsoleteAdvance in the government.txt inside the brackets of the gov you aim at.
but i never tested it myself
Ex
Code:
|
ObsoleteAdvance ADVANCE_HUMAN_RIGHTS |
Quote:
|
Originally posted by ahenobarb
3) In a scenario, could you edit the territory borders around a city?
|
Trick one.  But i am almost 100% sure that you cant in a easy way  .
The best way that comes to my mind is to create another player cities in the territory you dont want to have boders and them disband them right after. the territory wich the disbanded city occupied becomes neutral.
__________________
"Kill a man and you are a murder.
Kill thousands and you are a conquer.
Kill all and you are a God!"
-Jean Rostand
|
|
|
|
July 17, 2002, 02:12
|
#4
|
Warlord
Local Time: 14:26
Local Date: November 1, 2010
Join Date: Jun 2001
Location: Newcastle,Australia
Posts: 137
|
It is quite easy to make governments obsolete by using the flag in government.txt. This eliminates that government from the 'pick list' after the enabling advance has been achieved. The problem is that if the player is running an 'obsolete' government at the changeover event then that civ will remain in that government. There appears to be no easy way to automatically kick the player out of the obsolete government.
|
|
|
|
July 17, 2002, 04:21
|
#5
|
Deity
Local Time: 06:26
Local Date: November 1, 2010
Join Date: Nov 1999
Location: De Hel van Enschede
Posts: 11,702
|
As far as borders go, you can create tile improvements similar to the Fortress, that make the border expand. The radius of the expansion is determined by a variable that can be set, so you could simply create 1 (invisible) tile imp for every radius you would like and place them with SLIC (make sure cities themselves have a border radius of 0 or 1 then, or things could get screwed up). I've successfully tested this myself to simulate the expanding borders concept of Civ3. Only down-sides are shrinking borders and city radius. Making borders shrink properly is tricky, the 'real' border will shrink but some sort of remnant of the old border is left, which looks ugly on the map and causes a number of weird bugs; I haven't succeeded in making this work properly yet (but Pedrunn's trick is a good one, hadn't considered that yet - but it would be better to use tile imps rather than cities). The second problem is that the city radius *always* falls within the borders of a civ. If you edit cities so they have a border radius of 0 and then place a tile-imp with radius 1 through SLIC, it will work fine for 1-radius cities but when the city expands to size 9 (size 7 in the original game, IIRC), the city radius expands to 2 and the borders expand with it, whether you want to or not.
BTW, excellent explanation/comparison by Peter, that's one for the archives
Last edited by Locutus; July 17, 2002 at 04:28.
|
|
|
|
July 17, 2002, 11:02
|
#6
|
Prince
Local Time: 05:26
Local Date: November 1, 2010
Join Date: Dec 2000
Location: in perpetuity
Posts: 4,962
|
Just what I was thinking...
The one real pain translating Civ2 code to SLIC is the locations, which are bound to be different in the two games. God help whoever does Red Front.
__________________
Concrete, Abstract, or Squoingy?
"I don't believe in giving scripting languages because the only additional power they give users is the power to create bugs." - Mike Breitkreutz, Firaxis
|
|
|
|
July 17, 2002, 12:04
|
#7
|
Prince
Local Time: 04:26
Local Date: November 1, 2010
Join Date: Nov 2001
Posts: 437
|
Thanks everybody!
Great explanation Peter, I went through it line by line and now have a much better sense how to do things like this with .slc files. Great example BTW, I am playing the Cradle Mod and have Hammurabi, it's nice to look at some of the code, so I can see how this works out in the game.
From everything that I've gathered today, it looks like the Civ III mod that I shelved while I waited for improvements to the game to come out, will be coming off the shelf and into a CTP2 environment. CTP2 can do about 95% of the things I wanted to do in the mod, now to make time to acutally do it.
|
|
|
|
July 17, 2002, 13:26
|
#8
|
Deity
Local Time: 06:26
Local Date: November 1, 2010
Join Date: Nov 1999
Location: De Hel van Enschede
Posts: 11,702
|
Hey, that's great to hear  Don't restrain yourself in providing us with juicy details, we love juicy details
|
|
|
|
July 18, 2002, 01:41
|
#9
|
King
Local Time: 01:26
Local Date: November 1, 2010
Join Date: Jul 2001
Location: of Natal, Brazil
Posts: 2,555
|

Just let us know about the other 5%. We probably can help you get those
__________________
"Kill a man and you are a murder.
Kill thousands and you are a conquer.
Kill all and you are a God!"
-Jean Rostand
Last edited by Pedrunn; July 18, 2002 at 01:47.
|
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is On
|
|
|
All times are GMT -4. The time now is 00:26.
|
|