EDuke32 Scripting "CON coding help"
#1352 Posted 07 July 2013 - 05:36 AM
Fox, on 07 July 2013 - 05:13 AM, said:
Sorry this is what is in the dkgame.con file:
onevent EVENT_GETLOADTILE
setvar RETURN <3281>
endevent
#1353 Posted 07 July 2013 - 06:23 AM
This post has been edited by Fox: 07 July 2013 - 06:23 AM
#1354 Posted 07 July 2013 - 07:15 AM
#1355 Posted 07 July 2013 - 08:49 AM
onevent EVENT_GETLOADTILE setvarvar RETURN totalclock divvar RETURN 16 // animation speed andvar RETURN 3 addvar RETURN LOADSCREEN endevent
#1356 Posted 07 July 2013 - 01:17 PM
onevent EVENT_GETLOADTILE (don't know this purpose)
setvarvar RETURN totalclock (don't know this purpose)
divvar RETURN 16 // animation speed (this is the speed)
andvar RETURN 3 (don't know this purpose)
addvar RETURN LOADSCREEN (this is the tile 3281 as I'm right?)
endevent (This is the end of the event)
Thanks again.
#1357 Posted 07 July 2013 - 02:17 PM
endevent
This is used to call an event, which allows you to use some code at a specific occasion. For example, the EVENT_GETLOADTILE occur during the loading screen.
totalclock
It is a variable which value is constantly increased. It serves for the purpose of providing a timing for the animations.
andvar 3
Cycles the current value (totalclock divided by speed) through 0-3 (four frames).
LOADSCREEN
Same as 3281, as defined in DEFS.CON.
This post has been edited by Fox: 07 July 2013 - 02:18 PM
#1359 Posted 08 July 2013 - 04:40 AM
Quote
I can't make move of player in such sectors
Well, I did it
getplayer[THISACTOR].i PLAYERID setvarvar spriteid PLAYERID getactor[THISACTOR].sectnum rot_sect getactor[spriteid].sectnum se_sector ifvarvare rot_sect se_sector { getactor[THISACTOR].x x getactor[THISACTOR].y y getactor[spriteid].x x2 getactor[spriteid].y y2 subvarvar x2 x setvarvar dx x2 setvarvar rot_actspeed rot_angspeed ifvare rot_turnway 1 mulvarvar rot_actspeed -1 cos mycos rot_actspeed mulvarvar dx mycos divvarvar dx TRIG_MAX subvarvar y2 y setvarvar dy y2 sin mysin rot_actspeed mulvarvar dy mysin divvarvar dy TRIG_MAX addvarvar x dx subvarvar x dy //setactor[spriteid].x x setplayer[THISACTOR].posx x setvarvar dy y2 mulvarvar dy mycos divvarvar dy TRIG_MAX setvarvar dx x2 mulvarvar dx mysin divvarvar dx TRIG_MAX addvarvar y dy addvarvar y dx //setactor[spriteid].y y setplayer[THISACTOR].posy y //getactor[spriteid].ang se_ang getplayer[THISACTOR].ang se_ang addvarvar se_ang rot_actspeed setplayer[THISACTOR].ang se_ang //setactor[spriteid].ang se_ang }
#1360 Posted 08 July 2013 - 10:44 AM
chaingun: none
rpg: none
mighty boot: 0
freezer firing top half: 0
pistol: 1
shotgun: 2
shotgun firing: 4
pipebomb: 5
shrinker: 6
right devastator: 7
left tripbomb hand: 8
freezer: 9
pipebomb detonator: 10
expander: 11
shrinker crystal: 12
left devastator: 14
right tripbomb hand: 16
expander crystal: 22
tripbomb: 32
quick kick: 100
right shrunk fist: 101
left shrunk fist: 102
#1361 Posted 10 July 2013 - 06:07 PM
Quote
This command will allow you to select a different slot so that any HUD models you are drawing can store their animation state independently, without conflict. By default it uses the first slot, 0. If you need several animating HUD models, you should switch to another slot, draw the model with rotatesprite, then switch back using guniqhudid 0.
guniqhudid is short for "g (game? gun?) unique HUD ID".
In weapons.con (written by Hendricks) it just looks like he assigned all of the hud models a unique id (which is not necessarily necessary unless the models are going to display simultaneously or you need the animation state preserved but it's fine). No big deal.
#1362 Posted 10 July 2013 - 06:49 PM
I copied the guniqhudid values in weapons.con.sample verbatim from what is used in player.c.
#1364 Posted 13 July 2013 - 05:32 AM
#1365 Posted 13 July 2013 - 07:24 AM
Hendricks266, on 10 July 2013 - 06:49 PM, said:
I copied the guniqhudid values in weapons.con.sample verbatim from what is used in player.c.
The values appear to be almost random. Every piece should be separated in a different layer defined by MAXWEAPONS times the layer.
#1366 Posted 13 July 2013 - 05:31 PM
Its real basic stuff right now and will be expanded upon as I learn more coding. But I need help with a problem that I've spent the last 2 hours on and can't figure out the fix. When the dog charges the player and gets within a certain distance it goes into the DOGBITE mode. The problem is that it only performs the actions ( action, sound, player health) once instead of multiple times. When the player backs away and the dog approaches again its the same thing. Just one bite and then nothing. I'm guessing I need to nest some lines in a better place but I tried and tried and couldn't figure it out.
This post has been edited by Mblackwell: 13 July 2013 - 07:57 PM
Reason for edit: Added code tags to preserve formatting.
#1367 Posted 13 July 2013 - 07:54 PM
Generally I recommend avoiding AI commands and just using simple actions/actioncount/move commands. Then again I also tend to define everything as notenemy and then manually adding in spriteshadow and kill counts but I'm an oddball I guess.
#1368 Posted 14 July 2013 - 02:01 AM
BTW, I still have had zero success in coding any climbing abilities for new enemies.
This post has been edited by Mark.: 14 July 2013 - 04:44 AM
#1369 Posted 14 July 2013 - 10:07 AM
You seems to be confused with the use of {} and break.
This post has been edited by Fox: 14 July 2013 - 10:07 AM
#1370 Posted 14 July 2013 - 11:45 AM
This post has been edited by Mark.: 14 July 2013 - 11:47 AM
#1371 Posted 14 July 2013 - 02:27 PM
First of all you must understand that a code is constantly running. By default Duke 3D works at 30 time units (tics) per second, meaning that if you simply add a code inside of an actor (sprite), the code will run 30 times each second.
useractor notenemy MYENEMY addphealth 1 enda
The code above would basically increase the player health 1 point to a maximum of 100 points, and do so every tic, 30 times per second. There is no condition to it, so the moment you start the level, you would feel the effects.
An if condition basically makes the code works only under a specific circumstance. Example:
useractor notenemy MYENEMY ifpdistl 1024 addphealth 1 enda
Here I am telling the game to only heal the player if his distance to the current actor is less than 1024 Build units (same as the map editor). However the command would still run 30 times every second non-stop once you meet the condition, but I will return to this subject later.
An else is used for the opposite effect. Example:
useractor notenemy MYENEMY ifpdistl 1024 addphealth 1 else addphealth 10 enda
This would heal the player by 10 points if the player is at a distance of 1024 units to the actor, otherwise it will be just 1 point.
A nullop is a void command, and is used as a hack to tell the game to do nothing. Example:
useractor notenemy MYENEMY ifpdistl 1024 nullop else addphealth 1 enda
This basically tells the game to do nothing if the player is at less than 1024 units away, otherwise heal the player. In other words, it is the same as telling the game that the code should work only the player is 1024 or more units away. Of course this is just an example, there is a ifpdistg command so you wouldn't need to do that in this case.
The {} are used to enclose a piece of the code that works under the if condition. This is because by default an if condition only take affect on the first command used after it (normally on the first line below it). In other words, the {} you want to make the same condition apply to multiple commands. For example:
useractor notenemy MYENEMY ifpdistl 1024 { addphealth 1 addammo PISTOL_WEAPON 1 } enda
The code above heal the player by 1 point and increase the Pistol ammo by 1 shot if the player is at a distance of 1024 units. Below is a code that does the same thing, the difference is that the code above is more pleasing — and efficient.
useractor notenemy MYENEMY ifpdistl 1024 addphealth 1 ifpdistl 1024 addammo PISTOL_WEAPON 1 enda
Now you must understand how to use the {} with multiple if conditions.
useractor notenemy MYENEMY ifpdistl 1024 ifp pfacing { addphealth 1 addammo PISTOL_WEAPON 1 } enda
The code above is very simply, the two commands will only work if the player is at a distance of 1024 units and is facing the current actor. However you can change it:
useractor notenemy MYENEMY ifpdistl 1024 { addphealth 1 ifp pfacing addammo PISTOL_WEAPON 1 } enda
Now the player health will be increased by 1 health if he is at a distance of 1024 and facing the actor, however the ammo will only be increased if you are at a distance of 1024 regardless regardless of the direction the player is facing.
useractor notenemy MYENEMY ifpdistl 1024 { ifp pfacing addphealth 10 else addammo PISTOL_WEAPON 1 } else addphealth 1 enda
Above is a more complex example of how to handle the {} and if conditions. Inside the condition of the player at a distance of 1024 units, if the player is facing the current actor increase the health by 10, otherwise increase the ammo by 1; if the condition of the player being at a distance of 1024 is false, then increase the health by 1.
And here is an example of a series of if conditions, which is used a lot in GAME.CON:
useractor notenemy MYENEMY ifpdistl 1024 addphealth 100 else ifpdistl 2048 addphealth 50 else ifp pfacing addphealth 10 else addphealth 1 enda
The code above tells the game to increase the health by 100 if the player is at a distance of 1024 units, otherwise increase the health by 50 if the player at a distance of 2048 units, otherwise (i.e. the two previous conditions must be false) increase the health by 10 if the player is facing the actor direction, and if none of these conditions are true, increase the health by 1.
Now let's talk about the code running non-stop as I mentioned back then. That what you use actions for.
useractor notenemy MYENEMY ifpdistl 1024 ifaction 0 { addphealth 1 action AMYENEMY_STOP } enda
By default an actor starts with an action that equals zero, that's why I check if it is zero. Once the distance of 1024 units is meet, increase the player health by 1 point, and make the current actor action AMYENEMY_STOP. As a result, this code will only run a single time in the life.
Now here is a code that would make the code stop once the condition is meet, however it will be reset if the player is 1024 away again. Meaning that the player must walk forth and back to make the code works multiple times.
useractor notenemy MYENEMY ifpdistl 1024 { ifaction 0 { addphealth 1 action AMYENEMY_STOP } } else ifaction AMYENEMY_STOP action 0 enda
I hope this helped you to understand the logic behind the CON code.
#1372 Posted 14 July 2013 - 03:27 PM
3 things really stand out from your latest post.
1. I assumed all if / else code had to be in brackets but I see in the first examples that is not so.
2. That multiple else's can be strung together.
3. The nullop command for when you don't have an alternative to fill in.
Concerning the last code snippet, what is AMYENEMY_STOP defined as?
BTW, I really screwed myself earlier today. I got tired of scrolling the menu down to the newboard map every time I tested something. So I thought " hey I'll save the game right after it starts so I can use load game at the menu. Turns out that was a big mistake. The dog wouldn't start to run because "action" did not start at 0 in a saved game. So I butchered my code trying to figure out that one. Live and learn. Does this mean that I need to do something so that it will load properly on a saved game?
This post has been edited by Mark.: 14 July 2013 - 03:38 PM
#1373 Posted 14 July 2013 - 03:44 PM
action AMYENEMY_STOP 0
I would recommend you not to never use saved games if you are editing the CONs.
#1374 Posted 14 July 2013 - 06:08 PM
#1375 Posted 16 July 2013 - 02:09 AM
"shoot knee" seems to aime the player everytime and is not usefull ?
#1376 Posted 16 July 2013 - 06:35 PM
This post has been edited by Mark.: 16 July 2013 - 06:37 PM
#1377 Posted 25 July 2013 - 03:33 AM
#1378 Posted 27 July 2013 - 05:20 AM
Second question. How do I make an enemy model run a different dying animation when hit with the RPG? My thoughts are that I create a second version of the model with only the second dying animation in it. Then when the enemy is hit with the RPG I use "killit" to get rid of the first model and then have the second model spawned in.
EDIT: I tried out the spawning and it wasn't working. Then I remembered that only certain tile numbers will spawn so I'll have to replace one of those tiles with my dying model.
This post has been edited by Mark.: 27 July 2013 - 07:15 AM
#1379 Posted 27 July 2013 - 07:30 AM
#1380 Posted 27 July 2013 - 07:35 AM
This post has been edited by Mark.: 27 July 2013 - 07:57 AM