Jump to content
The Dark Mod Forums

Creating a Robust Tram Script


Epifire

Recommended Posts

I'm rereading my post and I think I forgot to mention that I had to create an identical spline (a backwards track) to run the opposite way. See as far as I know, the splines only have a starting point. From anything I've tried, they don't seem to support and kind of inversion methods. This runs in line with what Obsttorte was saying about using a spline for what it wasn't meant for. And believe me if I could find a smart and compact way for node based pathing to blend turns and pitch, I'd use them in a heartbeat.

 

So I'll back up a tad bit and explain what's causing that whole flip dilemma... .removeInitialSplineAngles()

 

This command is perfect for taking roll out of the func_mover_amodel. However, it has the unforeseen side affect of inverting pitch axis. Meaning you flip the wrong direction when moving on the same path (in reverse). This however is remedied by commenting out the, removeInitialSplineAngles() but then we return back to unpredictable roll on turns as well as the model realigning to face the newly introduced spline direction. My untested theory is that it may be resolved if the same model is mirrored (saved as an additional mesh) and toggled back and forth when either matching courses are plotted. It's too bad there wasn't a ready made command to just run a spline backwards, but I supposed floating cameras in DooM3 might have looked odd going the wrong way. :P

  • Like 1

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

It appears you are suffering from the same problem I experienced when I was making the searchlights for a storeyard / warehouse section - the issue is the the movers rotate according to the spline.

Therefore it is necessary to create TWO catmulroms for the same mover, and ensure that one acts as the ante-rotation for the initial spline.

eg,

 

// searchlight script to move objects bound to
// catmullrom spline movers $spline1&2
// to move in a circle or pattern.
 
void searchlight()
 
{
 
// killswitch is the name of the switch that turns on/off searchlights. it is easier if this is a switch/button that starts ON.
 
/* while (killswitch = [1/true] ) {*/
 
 
// Spline 1, sets the general path and rotation.
 
 
        $anchor.time(40);
        $anchor.accelTime(.1);
        $anchor.decelTime(.1);
 
        $anchor.startSpline($spline1);
 
    
// Spline2, anterotation, is to direct searchlight in correct direction, or it maintains original orientation.
 
        $anchor.time(40);
        $anchor.accelTime(.1);
        $anchor.decelTime(.1);
 
        $anchor.startSpline($spline2);
    
        }
}
 
 
-- with killswtich --
 
 
void searchlight ()
 
{
 
// 1st spline mover
 
     $anchor.time(40);
     $anchor.accelTime(.1);
     $anchor.decelTime(.1);
 
     $anchor.startSpline($spline1);
 
// 2nd spline mover
 
        $anchor.time(40);
        $anchor.accelTime(.1);
        $anchor.decelTime(.1);
 
        $anchor.startSpline($spline2);
 
}
 
// This works fine without /*while*/
// alternative method to try:
// while closer
 
void searchlight_looper()
 
{
 
while (killswitch = 1);  
sys.waitFor (searchlght);
 
}
 
void main ()
 
{
 
killswitch();
searchlights();
 
}
 

 

 

 

I'll see if I can find a map for this, so you can see the orientation of the two splines and how they work in order to keep the lights face outwards (or in your case, your train upwards).

 

The other option is to run a func_static as a mover and script accordingly - I've never tried this but it worked in D3 trains.

Edited by teh_saccade
Link to comment
Share on other sites

Your theory is correct that you must used the cats in the way you have described - I can't remember the exact set-up I used, as it was more than a week ago, but from the knock-up - it still works:



Two splines run in conjunction, one for the initial movement and another to control the pitch and roll of the movers (and anything bound) works well.

In this instance, a sweeping motion for a searchlight pattern was required, and so both splines had a slight up/down curve (as well as the 2nd ante-rotation in order to insure that the outward face [upwards face] always remain at the correct orientation):

Seems the while thing... I've forgotten... will have to re-read, as it is possible to see the cycle flick and repeat when the spline reaches its terminus.
Which would be no good for a train (or for a continuous searchlight, for that matter...).

It works well for pretty much anything (eg, a room, a CCTV camera, a maze, a platform, etc...) so long as there is a 2nd spline to make sure the 1st doesn't tip the object as it wants.

When I get back to this section of my campaign, I will investigate further and report any findings if you need them.
Similarly, since we are working towards the same goal (albeit, for different reasons), it would be appreciated if you might share you findings also (as it'd help me remember wtf I did and how I did it... :))

Here's the knock-up using the script and controlled by a switch that starts ON. I imagine that a tram would be a button operated trigger, similar to this, but player operated rather than operated by AI behaviour or set ON from start.

// video for spoiler

Edited by teh_saccade
Link to comment
Share on other sites

Right now I've been able to stabilize the path by making turns and inclines separate. I would like to point out that removeinitialSplineAngles() and disableSplineAngles() behave very differently. The only reason I wasn't able to use removeinitialSplineAngles() was because it inverted the incline angles when running the reversal spline. That is a really interesting usage you came up with. I feel like mine is much more simplified since it's just a two way mover.

What I'm shifting my focus to now has been making sure the buttons behavioral settings are correct. Say the button to start you out (forward) should only be able to trigger when at it's respective tram garage. When you reach the end of the track, the other button (backwards) should then be available. Neither button should ever be able to work at the same time and they can only fire once per trip.

Edited by Epifire

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

Have you read the "multistop train ride tutorial"..?

http://www.doom3world.org:80/phpbb2/viewtopic.php?t=7579

 

Idk if that's what you're looking for - but maybe including a "wait" and timing the train journey, so that the button cannot be pressed to reverse direction until it reaches the destination is an easy option..?

Link to comment
Share on other sites

I actually didn't see that part. Navigating the old saved pages was a little odd how it was all organized. It kinda flew past me when I was asking around but I realize now that I don't have to worry about the duration of the trip. This being because I'm using cameras and player interaction isn't possible. So that leaves the last bit of button sorting.

 

Can a button disable itself while enabling the other? It would just need to be in one press, as you wouldn't be able to use the other button until you came to a stop. It also would be worth mentioning that a negative press (inactive) would be great to have a snd attachment of some kind. The sound of course is extra fluff but in the end result I want to communicate to the player as best I can with glowing skins and so on.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

If you are using a script, this should be no problem. You can just have a button1.setFrobable(0) and button2.setFrobable(1), when button 1 is pushed and vice versa for button 2. I am not 100% sure, if the syntax is right, but I hope you get, what I mean. This option would, however, exclude to play a sound, when you press the inactive button. The alternative would be to introduce a variable that you set and then a script with something like "if varable = 0: run mover (not sure, which command you use for that right now) and set variable = 1; if variable = 1: play sound" and "if varable = 1: run mover and set variable = 0; if variable = 0: play sound" for the second button.

Link to comment
Share on other sites

Reckon you can toggleLock on frobs to change their on/off position?

 

If you're not already using atdm:alarm, then perhaps this can be tied to the button, and re-jig that the alarm_sound is something like the dead button press and doesn't alert ai.

 

Was thinking about this and wondering if TDM uses stuff like getButtons ($trainbutton) and if you could then operate trainbutton while ( [float] trainmoving == 1 ) and all that malarky, but then I thought...

If it was a self-locking switch that only unlocked when the doors (or exit light) came on - then it would play the "clunk i'm locked" sound so long as the switch was down...

or instead of declaring that stuff like trainmoving, maybe something simple like, "while trainpathforwards (spline or $trainobject) isMoving then toggleLock ($trainbutton01); if operate ($trainbutton01) then startSound (buttonnotworking);"

 

Then I thought, fuck all that coding - why not have the buttons panel recessed in the train and have a locked panel slide over it when the doors close - pickable but totally unpickable (as in tststststststttttsssttttstststt) because it would take longer to pick (esp. with the train noise) than the journey (in case player is bored of sitting in a train without an iPhone) - and have it open again as the train reaches the destination, thereby not even having to turn the buttons off or on or anything like this? Simple <-- this way or --> this way that are closed in when not required, and provide a pointless distraction for the player who doesn't know they can't get to them, no matter how hard they try (which is always fun).

Total zero sums the whole problem of playing sounds and having lights and ensuring soundshaders are loaded, setting the channels to play the sound, etc... to push a button that isn't going to do anything but go "clunk" and not do anything anyway.

ps,

I'd make it so that if they pushed the dead button 88 times during the train journey then, "missionsuccess", because the player is obviously very impatient for the ride to be over and deserves a reward for clicking the button 88 times +10,000 loot.

 

I miss BASIC.

Link to comment
Share on other sites

So there seems to be a strange problem with the camera I'm porting the player view to while the tram is in motion. When I hit a button (forward or backward) the screen flashes into the set camera and then instantly returns back to player1. Stranger still, when the tram completes it's assigned path, the camera will become active (once the tram comes to a halt). If I noclip I return back the the original player1 position, though I have no movement. If I'm in range of the buttons when froze I can frob the buttons to run again. If I switch back on the second trip around the camera works flawlessly. So why is it behaving so strange the first time? Here's what the script looks like...

 

 

 

void spline_path_forward()
{
	$tram_camera_1.activate($player1);   		//switch view
	$mover_object.time(20); 				 	//how long object take to move along spline
	$mover_object.accelTime(8); 				//time mover takes to accelerate to full speed range 0.0 to not more than time to travel spline
	$mover_object.decelTime(3);					//time mover takes to decelerate to a stop range as above
	$mover_object.startSpline($spline_forward);	//starts mover moving along spline
	sys.waitFor($mover_object); 				//wait for func_mover to finish moving along spline before doing anything else	
	$tram_camera_1.activate($player1);   		//return control to the player
}

void spline_path_backward()
{
	$tram_camera_1.activate($player1);   		//switch view
	$mover_object.time(20); 				 	//how long object take to move along spline
	$mover_object.accelTime(8); 				//time mover takes to accelerate to full speed range 0.0 to not more than time to travel spline
	$mover_object.decelTime(3);					//time mover takes to decelerate to a stop range as above
	$mover_object.startSpline($spline_backward);//starts mover moving along spline
	sys.waitFor($mover_object); 				//wait for func_mover to finish moving along spline before doing anything else	
	$tram_camera_1.activate($player1);   		//return control to the player
}


void main()
{
}
 

 

 

 

If I get this part working, I just need one more script that teleports the player off to the side of the tram when ever a button is pressed and when it comes to a stop. I'm not all sure as to how I kick the player out with a info_player_teleport yet, but I think that should be easy once I can figure out what can trigger it automatically. After that I'll worry about the active/inactive button flipflop modes.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

$mover_object.time(20);                     
$mover_object.accelTime(8);                
$mover_object.decelTime(3);
This stuff is only needed once. You don't have to execute this everytime (and I think you can set those as spawnargs on the mover_object directly)

 

Regarding the camera bug, place the camera activation command after the start spline command.

 

Player teleportation should work like this:

 

$player_teleport.activate($player1);
whereas player_teleport is the name of your info_player_teleport entity (this can differ).
  • Like 1

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Okay this helps tremendously. So far I've corrected the issue of the player dying to collision interference. There's something still wonky about the camera. Right now (with this script) it just kicks the player out, runs the spline path and then places the player in the camera position when finished. I've been trying to move the lines around but it either does this or nothing at all.

void spline_path_forward()
{
	$tram_dismount_1.activate($player1);		//kicks the player away from the tram to avoid collision smashing
	$mover_object.startSpline($spline_forward);	//starts mover moving along spline
	$tram_camera_1.activate($player1);   		//switch view
	sys.waitFor($mover_object); 				//wait for func_mover to finish moving along spline before doing anything else	
	$tram_camera_1.activate($player1);   		//switch view
	$tram_dismount_1.activate($player1);		//kicks the player away from the tram to avoid collision smashing
}

void spline_path_backward()
{
	$tram_dismount_2.activate($player1);		//kicks the player away from the tram to avoid collision smashing
	$mover_object.startSpline($spline_backward);//starts mover moving along spline
	$tram_camera_1.activate($player1);   		//switch view
	sys.waitFor($mover_object); 				//wait for func_mover to finish moving along spline before doing anything else	
	$tram_camera_1.activate($player1);   		//switch view
	$tram_dismount_2.activate($player1);		//kicks the player away from the tram to avoid collision smashing
}

Getting really close now. Everything in my alterations really seems to depend on the lines whether it's ahead or behind the sys.waitFor function. It's like the camera can't activate ahead of it in the timeline.

 

ALSO, Obs while we're on the discussion of cameras. Would the keyhole-look mechanic you came up with be compatible for a vehicle attachment scenario like this? That would be ideal compared to the locked camera placement I'm working with now. Not the foremost concern but it would definitely be a much better option if possible.

Edited by Epifire
  • Like 1

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

  • Like 1

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Specifically this one was the one that caught my curiosity. Since (from my knowledge) allows some form of user input and control...

 

Right now I just want to get a working camera (even if it's just a static camera bound to the mover). Though if it had some form of mouse look that would be fantastic! Cause right now it's just a static camera view and I want it to feel more life like if I have the option.

  • Like 2

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

The mouse movement is captured via script functions (startMouseGesture, getMouseGesture). You can see how this works by checking out the script for the player sword.

  • Like 1

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

I may try and look into that. I just can't get the first initial $tram_camera_1.activate($player1); to activate. What am I doing wrong? Cause it'll kick in the last activation line after sys.wait but it ignors the first entry completely. So basically the camera will just always trigger when the tram comes to a stop now. I mean I feel like it's something brain numbingly simple at this point that I fail to see, because it almost works %100.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

Do you try to activate the camera directly after the mission starts? This can be an issue because the entities required might not have been spawned at that stage. Try including one or two

 

sys.waitFrame();

commands at the beginning.

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Specifically this one was the one that caught my curiosity. Since (from my knowledge) allows some form of user input and control...

 

 

Right now I just want to get a working camera (even if it's just a static camera bound to the mover). Though if it had some form of mouse look that would be fantastic! Cause right now it's just a static camera view and I want it to feel more life like if I have the option.

 

I had no idea this existed... Was trying something similar previous with portalsky and lots of fiddling for a mask, but gave up in the end - not managed to get security camera working as yet, but now realise forgot to include input get.

 

Would there be a way to include a resource to a prefab door[handle] that contains the function to peek through keyholes for dumb people such as myself?

 

All these things, I end up with mechanical solutions (eg, no draw "sticky" ladders instead of dismount $player)... no wonder my mapping is such a fucking mess and I'm constantly having to restart sections due to small errors.

 

Et maintenant, muss ich apprender otro idioma eto slozjhneye chem enkelt og greit Engish ($motivation <= 1).

Link to comment
Share on other sites

Do you try to activate the camera directly after the mission starts? This can be an issue because the entities required might not have been spawned at that stage. Try including one or two

sys.waitFrame();

commands at the beginning.

 

Both forward and backward are called up via a button. I tried adding this new wait line to the beginning but nothing so far. Would you be interested in fidgeting around with it yourself if I sent the testmap and script via PM? I feel like it's something dreadfully simple that I'm not yet seeing. I just want to resolve it at this point, because I've burned a lot of time over the past week without any improvement on the camera situation.

 

EDIT: Aight finally got it to work, though I had to break it up into four scripts that separate the start and ends through relays to handle forward and backward tracks. A couple more things to pack in DR but it works really good. Mouse look would be a next best option to look into as well as getting default button enable/disable set to prevent starting from the wrong end of the railway.

Edited by Epifire

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

Would there be a way to include a resource to a prefab door[handle] that contains the function to peek through keyholes for dumb people such as myself?

If I would ever had created such an entity, yes. I haven't had the time to finalize the setup yet. This video is just a proof of concept.

  • Like 2

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

If I would ever had created such an entity, yes. I haven't had the time to finalize the setup yet. This video is just a proof of concept.

 

Wouldn't happen to have an example of the core script running that concept would ya? :P

 

Obviously none of that could just be plopped in and used 1:1 but it would certainly be a step in the right direction. I know you'd said the player sword uses something for mouse tracking but I actually hadn't found where that was stored in the game archives.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

guis/keyhole.gui (referred by the script)

 

 

windowDef Desktop
{
         rect 0, 0, 640, 480
         visible 1
         nocursor 1
         background ""

         windowDef keyhole
        {
                  rect 80,0,480, 480
                  background "textures/darkmod/camera"
                  visible 1
        }
        windowDef keyhole2
    {
            rect 120+"gui::posX", 40+"gui::posY", 400,400
            background "textures/darkmod/keyhole_blue"
            visible 1
    }
    windowDef keyhole3
    {
            rect 80-"gui::posX", 0-"gui::posY", 480,480
            background "textures/darkmod/keyhole"
            visible 1
    }
        windowDef leftBorder
       {
            rect 0,0,120+"gui::posX",480
            background _black
            visible 1
       }
        windowDef RightBorder
       {
            rect 520+"gui::posX",0,120-"gui::posX",480
            background _black
            visible 1
       }
       windowDef upperBorder
       {
            rect 0,0,640,40+"gui::posY"
            background _black
            visible 1
       }
       windowDef lowerBorder
       {
            rect 0,440+"gui::posY",640,40-"gui::posY"
            background _black
            visible 1
       }
       windowDef lowerBorder2
       {
            rect 0,480-"gui::posY", 640, "gui::posY"
            background _black
            visible 1
       }
}

 

 

textures/darkmod/camera (mtr file)

 

 

textures/darkmod/camera
{
qer_editorimage textures/editor/cameragui.tga
noshadows
guiSurf entity
discrete
translucent
sort "-2"
{
  red Parm0
  green Parm1
  blue Parm2
  remoteRenderMap 512 512 // width / height of render image
  scale 1 , -1  // the render view ars upside down otherwise
  translate 0, -1
}
    
{
        if ( parm11 > 0 )
        blend       gl_dst_color, gl_one
        map         _white
        blue         0.40 * parm11
    }
}

 

 

the keyhole images are custom stuff, you don't need them (remove the specific stages in the gui).

The script (keyhole is called via a frob_action_script in my case)

 

 

vector dirToVec(float d)
{
    if (!d) return '0 0 0';
    float ang = 45*(d-1);
    vector vec;
    vec_z=0;
    vec_x=sys.cos(ang);
    vec_y=sys.sin(ang);
    return vec;
}
vector dirToAngles(vector d)
{
    vector vec;
    vec_y=90+d_x*0.5;
    vec_x=-d_y*0.5;
    vec_z=0;
    return vec;
}
void keyholeThread()
{
    float go = $player1.createOverlay("guis/keyhole.gui",-1);
    $player1.setTurnHinderance("keyholeTurn", 0, 0);
    $player1.setHinderance("keyholeMove", 0, 0);
    float dir;
    vector x,y;
    while($player1.getButtons()!=17)
    {
        $player1.startMouseGesture(UB_NONE,0,3,0,1,0,0);
        dir=$player1.getMouseGesture();
        x=x+dirToVec(dir)*1;
        if (x_x>MAX_OFF_X) x_x=MAX_OFF_X;
        if (x_x<-MAX_OFF_X) x_x=-MAX_OFF_X;
        if (x_y>MAX_OFF_Y) x_y=MAX_OFF_Y;
        if (x_y<-MAX_OFF_Y) x_y=-MAX_OFF_Y;

        //sys.println(x);
        $player1.setGuiFloat(go, "posX", x_x*2);
        $player1.setGuiFloat(go, "posY", x_y*2);
        $keyhole1.setAngles(dirToAngles(x));
        sys.waitFrame();
    }
    $player1.setTurnHinderance("keyholeTurn", 1, 1);
    $player1.setHinderance("keyholeMove", 1, 1);
    $player1.destroyOverlay(go);
}
void keyhole(entity e)
{
    thread keyholeThread();
}

 

 

Undocumented and unpolished as said, have fun :D

 

keyhole1 is the func_cameraview targeted by the patch in the above video.

  • Like 2

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Thanks Obs! If I have the courage later I might try and attempt a heartier camera setup, but for now I'm just getting down to polishing the main controls. So for today I've made a collection of sounds to handle the tram's actions. Naturally start > move loop > stop. For some reason though the spawnargs for these functions don't seem to work on the func_mover_amodel. So I was resorting to adding them via script but I can't seem to get the right syntax. I did test the sounds via speaker btw, and they work fine in a normal (unscripted) instance.

void spline_path_forward()
{
	$tram_dismount_1.activate($player1);		//kicks the player away from the tram to avoid collision smashing	
	$mover_object.startSpline($spline_forward);	//starts mover moving along spline
	$mover_object.accelSound($tram_start);		//this sound handles when the tram starts moving
	$mover_object.moveSound($tram_loop);		//this sound loops as the mover is in transition
	$mover_object.decelSound($tram_stop);		//this sound plays when the tram is reaching it's end point
	sys.waitFor($mover_object); 			//wait for func_mover to finish moving along spline before doing anything else	
	$tram_dismount_1.activate($player1);		//kicks the player away from the tram to avoid collision smashing	
	$tram_camera_1.activate($player1);   		//switch view
}

I had checked the functions list to get these and I assumed the sound name would be in the latter portion. I hadn't been able to find any references with sounds ran via script control, but it feels rather stupid that this isn't working right now. I tried removing $ and just having something like (tram_stop) or (tram_stop.ogg) but no luck as of yet.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

The sound functions take the soundshader name as argument.

 

A general hint: The $ in front of a name means that the name refers to the name of an entity in the map, whereas leaving it away means it is the name of a variable defined in the script.

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Well if I leave out the $, the game kicks me back to the menu saying it's an unknown value (tram_start). Though they're the same names listed to call up the sounds from the soundshader file, and work if I just pull those up on a speaker in DR.

 

Is there a symbol, specific to calling up soundshaders references? From what I'm seeing it's looking through the script and since I'm defining a shader reference (not a reference to another portion of the script) it chucks it.

Modeler galore & co-authors literally everything

 

 

Link to comment
Share on other sites

The argument is supposet to be a string dude, so something like "this string". (Note the quotation marks ;) )

  • Like 1

FM's: Builder Roads, Old Habits, Old Habits Rebuild

Mapping and Scripting: Apples and Peaches

Sculptris Models and Tutorials: Obsttortes Models

My wiki articles: Obstipedia

Texture Blending in DR: DR ASE Blend Exporter

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recent Status Updates

    • OrbWeaver

      Does anyone actually use the Normalise button in the Surface inspector? Even after looking at the code I'm not quite sure what it's for.
      · 6 replies
    • Ansome

      Turns out my 15th anniversary mission idea has already been done once or twice before! I've been beaten to the punch once again, but I suppose that's to be expected when there's over 170 FMs out there, eh? I'm not complaining though, I love learning new tricks and taking inspiration from past FMs. Best of luck on your own fan missions!
      · 4 replies
    • The Black Arrow

      I wanna play Doom 3, but fhDoom has much better features than dhewm3, yet fhDoom is old, outdated and probably not supported. Damn!
      Makes me think that TDM engine for Doom 3 itself would actually be perfect.
      · 6 replies
    • Petike the Taffer

      Maybe a bit of advice ? In the FM series I'm preparing, the two main characters have the given names Toby and Agnes (it's the protagonist and deuteragonist, respectively), I've been toying with the idea of giving them family names as well, since many of the FM series have named protagonists who have surnames. Toby's from a family who were usually farriers, though he eventually wound up working as a cobbler (this serves as a daylight "front" for his night time thieving). Would it make sense if the man's popularly accepted family name was Farrier ? It's an existing, though less common English surname, and it directly refers to the profession practiced by his relatives. Your suggestions ?
      · 9 replies
    • nbohr1more

      Looks like the "Reverse April Fools" releases were too well hidden. Darkfate still hasn't acknowledge all the new releases. Did you play any of the new April Fools missions?
      · 5 replies
×
×
  • Create New...