Thread Tools
Old January 27, 2001, 00:20   #1
Chris B
Warlord
 
Chris B's Avatar
 
Local Time: 04:52
Local Date: October 31, 2010
Join Date: Oct 2000
Location: Canton, CT
Posts: 187
Need help with basic slic functions
IF this is already posted somewhere, let me know, but I think it'd be good to have a basic reference point for some commonly used functions in slic. I've learned a little by checking out the scenario file in certain cenarios but if someone could do a walk through them I'd be glad.
1) making a unit, building or wonder civ specific
2) making a unit building or wonder city specific
3) creating custom victory conditions
4)Setting alliances
5) creating General type units, that are replaced as they die
6) creating wonder enabled units or improvements
7) adding messages that appear when you start
can anybody help with at least sum of these???? Me and many others (im sure) would greatly appreciate it.

[This message has been edited by Chris B (edited January 26, 2001).]
Chris B is offline  
Old January 27, 2001, 18:26   #2
kormer
Chieftain
 
Local Time: 09:52
Local Date: October 31, 2010
Join Date: Jan 2001
Posts: 58
For setting alliances you will need to use LogregardEvent() and SetTrust() functions first to make nations like each other. Then you will have to manually make an alliance or pact from within the game. This is very annoying since there is no function to create an alliance from within the slic coding.

For messages when a game starts, thats complicated, very complicated in fact. Go download my dawn of a new millenium scenario beta thats over at omnigods site. Check out scenario.slc and follow it from there, but it provides an excellent example of how to setup individual messages for each nation.
kormer is offline  
Old January 27, 2001, 21:05   #3
heardie
Prince
 
heardie's Avatar
 
Local Time: 20:52
Local Date: October 31, 2010
Join Date: Aug 1999
Posts: 684
Okay thiis will be a bit brief, sorry.

1+2. You can use 'CreateUnit' or Event: CreateBuiliding for these.

See the file Slic2Func in Apolyton's modification section for the required variables.

3. The way I do it is with 'if' statments.
If you have a scenario and you need 7 cities, than everytime youo take a city, make 'citysTaken = citysTaken + 1". Then evveryturn check if 'citysTaken' == 7 and if it does they win.

4. Kormer explained that.

5. Create the unit in units.txt. Then too make it replalced when he dies, i would check the alexander code and borrow some of that, because that happens there.

6. Check
IfWonderBuilt(is that a function??) and if it is allow the unit to be built.(Maybe??)

7. Messages at start?
scenario.slc
Code:
HandleEvent(BeginTurn) 'Your_Function' pre 
{
	Message (g.player, 'YourMessage');
	DisableTrigger('Your_Function');
}
msg.slc
Code:
messagebox 'YourMessage' {
	Show();
	Title(ID_TITLE);
	Text(ID_TEXT
	Button(ID_EXIT) 
		{
			Kill();
		}
}
scen_str.txt
Code:
ID_TITLE "Your title here"
ID_TEXT  "  You message heree"
and in scenario.slc you must #include "msg.slc"


hope that helps
heardie is offline  
Old January 28, 2001, 09:51   #4
Chris B
Warlord
 
Chris B's Avatar
 
Local Time: 04:52
Local Date: October 31, 2010
Join Date: Oct 2000
Location: Canton, CT
Posts: 187
sure does, but how do you include message.slc?
Chris B is offline  
Old January 28, 2001, 18:58   #5
heardie
Prince
 
heardie's Avatar
 
Local Time: 20:52
Local Date: October 31, 2010
Join Date: Aug 1999
Posts: 684
quote:

Originally posted by Chris B on 01-28-2001 08:51 AM
sure does, but how do you include message.slc?

Code:
#include "message.slc"
heardie is offline  
Old January 28, 2001, 21:41   #6
Chris B
Warlord
 
Chris B's Avatar
 
Local Time: 04:52
Local Date: October 31, 2010
Join Date: Oct 2000
Location: Canton, CT
Posts: 187
I still dont understand how to make a unit available to only one civ or city
Chris B is offline  
Old January 29, 2001, 01:10   #7
heardie
Prince
 
heardie's Avatar
 
Local Time: 20:52
Local Date: October 31, 2010
Join Date: Aug 1999
Posts: 684
That can be done
HandleEvent(StartBuilding(or similar) 'StartBuilding_f' pre

if city[0] == 'The city youu want'{
return CONTINUE;
else
return STOP;
}

This assumes you know what city it is. There is probably a better way too
heardie is offline  
Old January 30, 2001, 07:23   #8
Locutus
Apolytoners Hall of FameCiv4 SP Democracy GameCiv4 InterSite DG: Apolyton TeamBtS Tri-LeagueC4BtSDG TemplarsC4WDG Team ApolytonCivilization IV CreatorsCTP2 Source Code ProjectPolyCast Team
Deity
 
Locutus's Avatar
 
Local Time: 11:52
Local Date: October 31, 2010
Join Date: Nov 1999
Location: De Hel van Enschede
Posts: 11,702
Making a unit/building/wonder civ-specific or wonder dependent: (1, 2, 6)

Very simple actually. I'm surprised to see none of the other SLICers know this, I explained it several times already. Not that I mind explaining it again (only good for my postcount ), but still...

To do any of these things, you should use the mod_* functions. So to make a unit civ-specific, use this:

Code:
int_f mod_CanCityBuildUnit(city_t theCity, int_t theUnit) {
city_t	tmpCity;
int_t	tmpUnit;
	tmpUnit = theUnit;
	tmpCity = theCity;

	if (tmpUnit == UnitDB(UNIT_SAMURAI)) {	// if samurai
		if (PlayerCivilization(tmpCity.owner) == CivilizationIndex("JAPANESE")) {
			return 1;		// japanese can build it
		} else {
			return 0;		// other civs can't
		}
	} elseif (tmpUnit == UnitDB(UNIT_MARINE)) {	// if marine
		if (PlayerCivilization(tmpCity.owner) == CivilizationIndex("AMERICANS")) {
			return 1;		// americans can build it
		} elseif (PlayerCivilization(tmpCity.owner) == CivilizationIndex("ENGLISH")) {
			return 1;		// english can build it
		} else {
			return 0;		// other civs can't
		}
	// } elseif (... -> etc. until all civ specific units have been treated
	} else {				// if other unit
		return 1;			// everyone can always build it
	}
}
Here's another example for making buildings wonder enabled:

Code:
int_f mod_CanCityBuildBuilding(city_t theCity, int_t theBuilding) {
city_t	tmpCity;
int_t	tmpBuilding;
	tmpBuilding = theBuilding;
	tmpCity = theCity;

	if (tmpBuilding == BuildingDB(IMPROVE_BROKERAGE)) {	// if brokerage
		if (PlayerHasWonder(tmpCity.owner, WonderDB(WONDER_LONDON_EXCHANGE)) {
			return 1;	// civ with London Exchange can build it
		} else {
			return 0;	// other civs can't
		}
	// } elseif (... -> etc. until all wonder enabled buildings have been treated
	} else {				// if other building
		return 1;			// everyone can always build it
	}
}
You can do similar things for specific cities and many other conditions. Simply replace the if-conditions with whatever you need. If you have cities in variables, ala the Alexander the Great scenario, you can simply check if current city is city in variable: 'if (LondonCity == tmpCity) {' or 'if (LondonLoc == tmpCity.location) {'. If you don't have the cities in variables, use more generic techniques, like 'if (player[0].capital == tmpCity) {' (once you set player[0] to tmpCity.owner) or 'if (CityIsNamed(tmpCity, "Amsterdam")) {'. Though in this case you should keep in mind that people might rename cities or relocate the capital.

For wonders you can use mod_CanCityBuildWonder and for advances mod_CanPlayerHaveAdvance (where the city argument is replaced by a player argument). Check out the various Activision scenarios for more examples.

Victory conditions (3) can get pretty complicated, but heardie gave a nice and simple example. Have a look at the existing scenarios for more examples and try a few things yourself. If there are specific things that you can't get done, post those here. But victory conditions in general is not specific enough, the possibilities are endless.

Setting alliances (4): Kormer explained that, but you can also do it without SLIC if you prefer that. Replace the diplomacy files by a version that makes the AI really, really like and trust you when you give him your map or gold or whatever. Then give him your map or some gold a couple of times and ask for any treaty you want. After you set everything you needed to set (possibly by repeating this process a couple of times while using a different version of the diplo files every time), replace the diplomacy files with the original ones again.

Generals (5): like others said, check out the Alexander and other scenarios for that. Search all SLIC files for the text 'general' and you should find all general related code (keep in mind though that the existing code still has some unresolved bugs that Harlan and his team (including yours truly) are working on).

Messages (7): Heardie explained that.
[This message has been edited by Locutus (edited January 30, 2001).]
Locutus is offline  
Old January 30, 2001, 20:20   #9
heardie
Prince
 
heardie's Avatar
 
Local Time: 20:52
Local Date: October 31, 2010
Join Date: Aug 1999
Posts: 684
That is much easier. I never knew how the _Mod functions worked, because they arent called in any triggers, so I never bothered to look at them, but tnow I see there use
heardie is offline  
Old January 31, 2001, 03:27   #10
Alpha Wolf
Chieftain
 
Local Time: 09:52
Local Date: October 31, 2010
Join Date: Feb 2001
Location: Prince of the Barbarians
Posts: 0
I can code the actual functions but i cant figure out how to trigger them. Your examples make perfect sense to me but WHEN do you call them? The IFs are easy, but I cant ever get anything to actually work so I must not be triggering them right.

------------------
History is written by the victor.
Alpha Wolf is offline  
Old January 31, 2001, 06:35   #11
Locutus
Apolytoners Hall of FameCiv4 SP Democracy GameCiv4 InterSite DG: Apolyton TeamBtS Tri-LeagueC4BtSDG TemplarsC4WDG Team ApolytonCivilization IV CreatorsCTP2 Source Code ProjectPolyCast Team
Deity
 
Locutus's Avatar
 
Local Time: 11:52
Local Date: October 31, 2010
Join Date: Nov 1999
Location: De Hel van Enschede
Posts: 11,702
You don't need to call them, the game calls them automaticly every time the build-window is opened and every time the AI makes a decision on what to build in a certain city. The way to look at these functions is that they overload (or 'overwrite') existing functions of the game engine that are always called to determine what can and can't be built.

If you can't get your code to work you must be doing something else wrong. If you post or email me (an example of) your code, I'll have a look at it and tell you what goes wrong.
Locutus is offline  
Old February 5, 2001, 22:35   #12
Chris B
Warlord
 
Chris B's Avatar
 
Local Time: 04:52
Local Date: October 31, 2010
Join Date: Oct 2000
Location: Canton, CT
Posts: 187
alright. tonite i tried creting a message for a scenario
i put #include mesage.slc in scenario and made a message in the file as well as a msg_str, but when it loaded it said message.slc was not in an the asset tre. It also said there was a syntax error in scenario.slc

herez what i put in scenario.slc:
// Scenario script for The Communists Have Come

#include "message.slc"

HandleEvent(BeginTurn) 'Show()' pre
{
Message (g.player, 'Intro');
DisableTrigger('ID_EXIT');
}

also, should message be a wordpad doc or a txt dod. i have it as a txt doc.
Thanx 2 anyone who helps.
-CB
Chris B is offline  
Old February 6, 2001, 05:02   #13
ALPHA_WOLF
Guest
 
Posts: n/a
[quote]Originally posted by Locutus on 01-31-2001 05:35 AM
You don't need to call them, the game calls them automaticly every time the build-window is opened and every time the AI makes a decision on what to build in a certain city. The way to look at these functions is that they overload (or 'overwrite') existing functions of the game engine that are always called to determine what can and can't be built.
quote]

this is good to know. I've been adding more wonders that give buildings and I really dont want to AI to keep building those buildings. Its a waste of prod and support costs. I'd also like for the human player buildings that are redundant due to wonders, to be in another color in the build list or even in the built buildings under the city. Is this possible? Can the AI be told to sell a building? I didnt see that listed under the functions, or maybe I just missed it.

I'm still annoyed my previous SLIC attempts dont work on my new machine, but do work on my old one...grrrrrrrrrrrr I've tried every change I could think of but got screwy results every time.

------------------
History is written by the victor.
 
Old February 6, 2001, 12:37   #14
Locutus
Apolytoners Hall of FameCiv4 SP Democracy GameCiv4 InterSite DG: Apolyton TeamBtS Tri-LeagueC4BtSDG TemplarsC4WDG Team ApolytonCivilization IV CreatorsCTP2 Source Code ProjectPolyCast Team
Deity
 
Locutus's Avatar
 
Local Time: 11:52
Local Date: October 31, 2010
Join Date: Nov 1999
Location: De Hel van Enschede
Posts: 11,702
Chris,
I'm getting the impression you didn't understood messages correctly. I think what you're trying to do is the following:

In file scenario.slc:
Code:
// Scenario script for The Communists Have Come

#include "message.slc"

HandleEvent(BeginTurn) 'ShowMessage' pre {
	Message(g.player, 'Intro');
	DisableTrigger('ShowMessage');
}
In file message.slc:
Code:
// Scenario messages for The Communists Have Come

Messagebox 'Intro' {
	Show();
	Text(ID_EXIT);
}
In file msg_str.txt:
Code:
EXIT		"Put message here"
What this does is show the message "Put message here" to the first player in the first turn and after that this code is never executed again (not sure if the first player is human or barbarian but replacing g.player with 1 will always send the message to player 1, i.e. normally the human player). Is this what you wanted or am I misinterpreting your intentions?

What goes wrong in your current set up is that the file message.slc doesn't even exist. The idea is that you not only put that line in scenario.slc but also actually create the file and put all messagecode in there. Alternatively you could just put all SLIC code (HandleEvent and Messagebox) in 1 file (scenario.slc), nothing wrong with that either. All files in CtP2 are regular text files (txt), Word documents (doc) aren't used by the game.

AW,
I guess I wasn't clear enough about that. The mod_* functions are executed when the AI makes his build orders as well, the AI has an event that's equivilant to the 'human event' of opening the build-manager. So the changes you make in these mod_* functions apply to humans as well as AIs. If you don't want the AI to build certain things, use a condition like IsHumanPlayer. I don't think you can edit the colors in the build manager, but maybe if you dig really deep in the ldl files you might be able to figure out a way (though noone has ever really done that before, so you'd be boldy going where no man has gone before... ). Yes, the AI can be told to sell buildings using SLIC: there's a SellBuilding event that can probably be called with 'Event:SellBuilding();', but I didn't actually try yet.
Locutus is offline  
 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is On

Forum Jump


All times are GMT -4. The time now is 05:52.


Design by Vjacheslav Trushkin, color scheme by ColorizeIt!.
Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Apolyton Civilization Site | Copyright © The Apolyton Team