All pastes #498580 Raw Edit

Something

public text v1 · immutable
·published 2007-05-20 15:24 UTC
rendered paste body


// Note: You don't have to bother about the things about if(units_inside>=7) and --units_inside; and ++units_inside
// Normally the FBI and engine handle counting the units and you don't have to worry about that in script
// Just here I wanted to be sure the script doesn't crap if you edit the FBI

// Here I store each unit to a different "basket" holding position
// Normally you have none of this if(units_inside==7) attach-unit id to basket7;
// And instead a single attach-unit id to 0 - 1;

// Here I calculate a speed so that the loading and unloading movement complete exactly in a given time.
// Normally you use a fixed speed, ex speed [30]; and some wait-for instead of the sleep

// unload_shoulder and load_shoulder can be the same piece
// unload_arm and load_arm can be the same piece
// torax is the center of the "transportation turret"
// units will go toward and from "torax" during loading/unload animation
// *_shoulder is child of base, with 0 offset, and *_arm is child of *_shoulder, which 0 offset
// Hmm, I wrote it badly, so you can have "torax" higher than the base along Y, but not on a different xz position.

#define MAX_LOAD_RADIUS [120]
#define MAX_UNLOAD_RADIUS [300]
#define LOAD_TIME 2500
#define UNLOAD_TIME 1500

TransportPickup(id)
	{
	
	//Abort if already filled up
	if(units_inside>=7)
		{
		return;
		}
	
	// If close enough to allow loading:
	if(get XZ_HYPOT(get PIECE_XZ(torax) - get UNIT_XZ(id))<=MAX_LOAD_RADIUS)
		{
		
		// we're busy loading, don't disturb:
		set BUSY to 1;
		
		// instantly move the magical invisible arm to the position where the unit to load is
		turn load_shoulder to y-axis get XZ_ATAN(get PIECE_XZ(load_shoulder) - get UNIT_XZ(id)) now;
		move load_arm to z-axis get XZ_HYPOT(get PIECE_XZ(load_shoulder) - get UNIT_XZ(id)) now;
		move load_arm to y-axis get UNIT_Y(id) - get PIECE_Y(load_shoulder) now;
		
		attach-unit id to load_arm;
		
		//slowly move the arm, carrying the unit, to the spider center (moving to proper basket pos would be too complex for now)
		move load_arm to z-axis 0 speed ((get XZ_HYPOT(get PIECE_XZ(load_shoulder) - get UNIT_XZ(id)))/(LOAD_TIME))*1000;
		move load_arm to y-axis get PIECE_Y(torax) - get PIECE_Y(load_shoulder) speed ((get PIECE_Y(torax) - get UNIT_Y(id))/(LOAD_TIME))*1000;// I assumed the torax would have a higher Y than the loaded unit, if not the speed would be negative and that would be BAD!
		sleep LOAD_TIME;
		
		// Ideally here I would check that the loading was successful. Bah, let's not to simplify.
		
		// Let's not forget to update the counter
		++units_inside;
		
		// now that part that specifically interest you:
		if(units_inside==1)	
			{
			attach-unit id to basket1;
			}
		if(units_inside==2)	
			{
			attach-unit id to basket2;
			}
		if(units_inside==3)	
			{
			attach-unit id to basket3;
			}
		if(units_inside==4)	
			{
			attach-unit id to basket4;
			}
		if(units_inside==5)	
			{
			attach-unit id to basket5;
			}
		if(units_inside==6)	
			{
			attach-unit id to basket6;
			}
		if(units_inside==7)	
			{
			attach-unit id to basket7;
			}
		
		// Ok, we're done, the engine may proceed to next action. (Or something like that, I'm not even sure that "BUSY" really do something.)
		set BUSY to 0;
		
		}
	
	}


TransportDrop(id,xz)
	{
	// If close enough to allow unloading:
	if(get XZ_HYPOT(get PIECE_XZ(torax) - get UNIT_XZ(id))<=MAX_UNLOAD_RADIUS)
		{
		
		// we're busy unloading, don't disturb:
		set BUSY to 1;
		
		// instantly reset the position of the magical invisible arm (and turn it already, ok)
		turn unload_shoulder to y-axis get XZ_ATAN(get PIECE_XZ(unload_shoulder) - xz) now;
		move unload_arm to z-axis 0 now;
		move unload_arm to y-axis get PIECE_Y(torax) - get PIECE_Y(unload_shoulder) now;
		
		attach-unit id to unload_arm;
		
		//slowly move the arm, carrying the unit, to the pos where to unload
		move unload_arm to z-axis get XZ_HYPOT(get PIECE_XZ(unload_shoulder) - xz) speed ((get XZ_HYPOT(get PIECE_XZ(unload_shoulder) - xz))/(UNLOAD_TIME))*1000;
		move unload_arm to y-axis get GROUND_HEIGHT(xz) - get PIECE_Y(unload_shoulder) speed ((get PIECE_Y(torax) - get GROUND_HEIGHT(xz))/(UNLOAD_TIME))*1000;//again, I assumed that torax was above ground, if not, speed would be negative, and things could go BAD!!
		sleep UNLOAD_TIME;
		
		// Ideally here I would check that the unloading was successful. Bah, let's not to simplify.
		
		// Let's not forget to update the counter
		--units_inside;
		
		// And now, ladies and gentlemen, the drop command:
		drop-unit id;
		
		// Ok, we're done, the engine may proceed to next action. (Or something like that, I'm not even sure that "BUSY" really do something.)
		set BUSY to 0;
		
		}
	
	}