User Tag List

Results 1 to 10 of 23

Thread: Fire Rod

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Octorok Lelouche Vi Britannia's Avatar
    Join Date
    Oct 2015
    Location
    Britannia - Area 11
    Posts
    173
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)
    vBActivity - Stats
    Points
    1,113
    Level
    11
    vBActivity - Bars
    Lv. Percent
    46.64%
    Sounds like some exciting changes are coming in 2.54 that will make everyone's lives easier.

    Code as it is doesn't compile, copied from the link you left. Not sure if its a version thing or a syntax thing. Made an attempt to fix it and ran into more errors. Seems to be syntax.
    Lost my wings and grew 8 tentacles... I've seen enough Hentai to know where this is going....

  2. #2
    The Timelord
    QDB Manager
    ZC Developer

    Join Date
    Oct 2006
    Location
    Prydon Academy
    Posts
    1,396
    Mentioned
    112 Post(s)
    Tagged
    1 Thread(s)
    vBActivity - Stats
    Points
    4,765
    Level
    21
    vBActivity - Bars
    Lv. Percent
    69.82%
    Quote Originally Posted by Lelouche Vi Britannia View Post
    Sounds like some exciting changes are coming in 2.54 that will make everyone's lives easier.

    Code as it is doesn't compile, copied from the link you left. Not sure if its a version thing or a syntax thing. Made an attempt to fix it and ran into more errors. Seems to be syntax.
    IDK if you compiled the latest. I expect errors as this is pretty long, and I rewrote it from scratch today, based on the formula that I used in the past. You will have a number of errors if you are not using 2.53 though, as it relies on std.zh stuff such as FLIP_ and ROT_ . It'll give you missing identifiers for those, and then syntactical stuff, might follow.

    For the most part, I wanted to outline it, and push it to the Z3 template package. I can fix it, or update it, later, but you can always have a look at how I did things and try to implement them on your own, if you wish. I have been putting this off because I wanted to make it for the Z3 package, which will use 2.54 or above for quite a lot. Nothing in it is 2.54-specific though, unless the array usage is a problem. I'll load it and see what happens.

    Here is a version free of compiler errors:

    Code:
    ////////////////////////////
    /// Simple Firerod       ///
    /// v0.3                 ///
    /// By: ZoriaRPG         ///
    /// 24th September, 2017 ///
    ////////////////////////////
    /// Note: All of this is ugly. In 2.54, you will be able to set NPCs to specific script defences, so you can use a real
    ///       FLAME weapon that you set up, and 2.54 may add SCRIPT weapon triggers to combos, as well. 
    
    
    int LightSources[3120]; //All the light source metrics for drawing, per frame. 
    //x, y, diameter: 176 combos * 3 layers, (255 weapons * 2) * 3
    
    //Settings
    const int LW_CUST_FLAME 	= 31; //Script 1
    const int FIREROD_MIN_STEP 	= 100;
    const int FIREROD_DAMAGE 	= 4;
    const int FIREROD_MISC_INDEX 	= 1;
    const int FIREROD_FLAME_FLAG 	= 00001000b;
    const int FIREROD_FLAME_SPRITE 	= 89;
    const int BLANK_FIRE_SPRITE 	= 90; //Should be a blank tile sprite.  
    
    //The diameter of the light source for combos.
    const int LIGHT_SOURCE_COMBO_RADIUS_MIN = 29;
    const int LIGHT_SOURCE_COMBO_RADIUS_MAX = 33;
    //The diameter of the light source for weapons. 
    const int LIGHT_SOURCE_WPN_RADIUS_MIN = 22;
    const int LIGHT_SOURCE_WPN_RADIUS_MAX = 26;
    
    const int BITMAP_DARKNESS = 2; //The bitmap ID to use for the darkness effect.
    const int DARKROOM_LAYER = 7; //The layer to blit the output bitmap.
    const int COLOUR_BLACK = 0x0F; //A  black colour swatch in your palette. 
    
    const int LIGHT_SOURCE_CIRCLE_SCALE = 1; //Scale and layer args for the colour-0 circles. 
    const int LIGHT_SOURCE_CIRCLE_LAYER = 0;
    
    item script BasicFireRod{
    	void run(int sprite, int damage, int step_speed){
    		Link->Action = LA_ATTACKING;
    		lweapon flame = Screen->CreateLWeapon(LW_CUST_FLAME);
    		flame->X = Link->X;
    		flame->Y = Link->Y;
    		flame->UseSprite(Cond(sprite > 0, sprite, FIREROD_FLAME_SPRITE));
    		flame->Dir = Link->Dir;
    		if ( Link->Dir == DIR_UP ) {
    			flame->Y -= 16;
    		}
    		if ( Link->Dir == DIR_DOWN ) {
    			flame->Flip = FLIP_VERTICAL;
    			flame->Y += 16;
    			
    		}
    		if ( Link->Dir == DIR_RIGHT ) {
    			flame->Flip = ROT_CCW;
    			flame->X += 16;
    		}
    		if ( Link->Dir == DIR_RIGHT ) {
    			flame->Flip = ROT_CW;
    			flame->X -= 16;
    		}
    		//Ternary would help here, as it would jus tbe:
    		//flame->Step = step_speed > 0 ? step_speed : FIREROD_MIN_STEP; 
    		//sigh. 
    		flame->Step = Cond(step_speed > 0, step_speed, FIREROD_MIN_STEP); 
    		flame->Damage = Cond(damage > 0, damage, FIREROD_DAMAGE); 
    		//! Damage is forwarded to the real fire weapon via the global active script.
    		flame->Misc[FIREROD_MISC_INDEX] |= FIREROD_FLAME_FLAG; //Mark it for detection. 
    		flame->HitYOffset = -214747; //Move the true hitbox offscreen so that it cannot trigger or hit anything. 
    		//! The global active script handles real collisions. 
    	}
    }
    
    //Returns true if the combo at '(x, y)' has either an inherent or place flag of type 'flag'
    bool ____LayerComboFI(int pos, int flag, int layer){
    	return GetLayerComboF(layer,pos) == flag || GetLayerComboI(layer,pos) == flag;
    }
    
    
    
    //Call before Waitdraw. 
    void DoFireRod(){
    	int cmb_pos; bool makeflame; int flags[3]={CF_CANDLE1, CF_CANDLE2};
    	for ( int q = Screen->NumLWeapons(); q > 0; q-- ) {
    		lweapon l = Screen->LoadLWeapon(q);
    		if ( l->ID == LW_CUST_FLAME ){
    			if ( l->Misc[FIREROD_MISC_INDEX]&FIREROD_FLAME_FLAG ) {
    				//We make a real dire weapon on top of fire trigger combos. 
    				cmb_pos = ComboAt(l->X, l->X);
    				for ( int q = 0; q < 3; q++ ) {
    					for ( int w = 0; w < 2; w++ ) {
    						if ( ____LayerComboFI(cmb_pos, flags[w] , q ) ) {
    							lweapon makefire = Screen->CreateLWeapon(LW_FIRE);
    							makefire->X = ComboX(cmb_pos);
    							makefire->Y = ComboY(cmb_pos);
    							makefire->UseSprite(BLANK_FIRE_SPRITE);
    							makefire->Misc[FIREROD_MISC_INDEX] |= FIREROD_FLAME_FLAG;
    							SetLayerComboF(LAYER_TORCH_FLAG, cmb_pos, CF_LIT_TORCH);
    						}
    					}
    				}
    				//Make fire weapon on enemies on collision if the enemy has its hitbox enabled, and on-screen.
    				for ( int e = Screen->NumNPCs(); e > 0; e-- ) {
    					npc n = Screen->LoadNPC(e);
    					if ( !n->CollDetection ) continue; 
    					if ( n->HitXOffset < 0 ) continue;
    					if ( n->HitXOffset > 255 ) continue;
    					if ( n->HitYOffset < 0 ) continue;
    					if ( n->HitYOffset > 255 ) continue;
    					if ( Collision(l,n) ){
    						lweapon makefire = Screen->CreateLWeapon(LW_FIRE);
    						makefire->Damage = l->Damage;
    						makefire->X = n->X + n->HitXOffset;
    						makefire->Y = n->Y + n->HitYOffset;
    						Remove(l); //Remove the fire rod object.
    						//Fire weapons on enemies should be real gfx. 
    						//makefire->UseSprite = BLANK_FIRE_SPRITE;
    					}
    				}
    			}
    		}
    	}
    }
    
    const int CF_LIT_TORCH = 99; //script 2. 
    const int LAYER_TORCH_FLAG = 0; //Look for them on his layer. 
    
    
    //Call before Waitdraw()
    //DarkDroom(DARKROOM_LAYER, false, BITMAP_DARKNESS);
    void DarkRoom(int layer, bool trans, int bitmap_id)
    {
    	int q[16]; int src; int cnt; 
    	int lightsourceflags[]={CF_LIT_TORCH}; 
    	q[9] = SizeOfArray(lightsourceflags);
    	int lightsourceflaglayers[]={LAYER_TORCH_FLAG};
    	q[15] = SizeOfArray(lightsourceflaglayers);
    	
    	for ( q[10] = SizeOfArray(LightSources); q[10] >= 0; q[10]-- ) { LightSources[ q[10] ] = -1; } //Wipe it every frame. 
    	Screen->SetRenderTarget(bitmap_id);
    	Screen->Rectangle(layer, 0, 0, 256, 256, COLOUR_BLACK, 100, 0, 0, 0, true, OP_OPAQUE);
    	//Add light sources to the array for combos. 
    	for ( q[0] = 0; q[0] < q[15]; q[0]++ ) 
    	{
    		//Check for light sources on layers
    		for ( q[1] = 0; q[1] < 176; q[1]++ ) 
    		{
    			//check all positions.
    			for ( q[2] = 0; q[2] < q[9]; q[2]++ ) 
    			{	//and all flags
    				if (  ____LayerComboFI(q[1], lightsourceflags[ q[2] ], lightsourceflaglayers[ q[0] ] ) ) 
    				{
    					LightSources[src] = ComboX(q[1]);
    					LightSources[src+1] = ComboY(q[1]);
    					LightSources[src+2] = Rand(LIGHT_SOURCE_COMBO_RADIUS_MIN, LIGHT_SOURCE_COMBO_RADIUS_MAX);
    					cnt++; 
    					src+=3;
    				}
    			}
    		}
    	}
    	//add light sources to the array for weapons
    	for ( q[4] = Screen->NumLWeapons(); q[4] > 0; q[4] -- )
    	{
    		lweapon l = Screen->LoadLWeapon(q[4]);
    		//for special fire rod weapons
    		if ( l->ID == LW_CUST_FLAME )
    		{
    			LightSources[src] = l->X + 8;
    			LightSources[src+1] = l->Y + 8;
    			LightSources[src+2] = Rand(LIGHT_SOURCE_WPN_RADIUS_MIN, LIGHT_SOURCE_WPN_RADIUS_MAX);
    			cnt++; 
    			src+=3;
    		}
    		//for fire weapons that are not dummy weapons
    		if ( l->ID == LW_FIRE )
    		{
    			if ( (l->Misc[FIREROD_MISC_INDEX]&FIREROD_FLAME_FLAG) != 0 ) 
    			{
    				LightSources[src] = l->X + 8;
    				LightSources[src+1] = l->Y + 8;
    				LightSources[src+2] = Rand(LIGHT_SOURCE_WPN_RADIUS_MIN, LIGHT_SOURCE_WPN_RADIUS_MAX);
    				cnt++; 
    				src+=3;	
    			}
    		}
    	}
    	
    	q[13] = cnt*3;
    	//Draw all light sources to the bitmap.
    	for ( q[12] = 0; q[12] <= q[13]; q[12] += 3 )
    	{
    		Screen->Circle(LIGHT_SOURCE_CIRCLE_LAYER, LightSources[ q[12] ], LightSources[ q[12]+1 ], LightSources[ q[12]+2 ], 0, LIGHT_SOURCE_CIRCLE_SCALE,
    		0,0,0, true, OP_OPAQUE);
    		if ( LightSources[ q[12] ] == -1 ) break; //Sanity check. 
    	}
    	
    	//! Blits
    	Screen->SetRenderTarget(RT_SCREEN);
    	// if ( trans )  //2.54+ stuff t/b/a
    	// {
    	//	Screen->DrawBitmapEx()
    	// }
    	// else {
    	Screen->DrawBitmap(layer, bitmap_id, 0, 0, 256, 176, 0, 0, 256, 176, 0, true);
    }
    It should be obvious, but, this does not mean that it works as-is. I fixed all of the actual syntactical issues, but I have not tested it. Any major issues at this stage, would most likely be from inappropriate pointers, calling stuff in loops using the wrong identifier, or the wrong array index; and similar. Then again, it might work. You never know.

    You can view the diffs on GitHub if you want to see what I changed at each stage.

Thread Information

Users Browsing this Thread

There are currently 3 users browsing this thread. (0 members and 3 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
About us
Armageddon Games is a game development group founded in 1997. We are extremely passionate about our work and our inspirations are mostly drawn from games of the 8-bit and 16-bit era.
Social