//Chip Wars, Copyright (c) by Paul Roman Ograbisz. All rights reserved. unit ChipWars; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls, Menus; type TForm1 = class(TForm) missionpanel: TPanel; gamescreen: TImage; userinput: TEdit; Panel1: TPanel; Panel2: TPanel; debugmemo1: TMemo; settinglevelsize: TEdit; settinglevelactors: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; settinggamescreensize: TEdit; settinglevelwallpercentage: TEdit; Label6: TLabel; procedure userinputChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure drawgamescreen(); procedure generatelevel(); procedure objectmover(movingactor:integer; direction:integer); procedure entermission(); procedure missionturncycle(actingactor:integer); procedure Panel1Click(Sender: TObject); procedure killactor(newdeadactor:integer); procedure Panel2Click(Sender: TObject); procedure closecombat(attacker:integer; defender:integer); procedure drawchipchip(direction:integer; x:integer; y:integer); procedure drawhelmet(helmettype:integer; helmetcolor:tcolor; direction:integer; x:integer; y:integer); procedure drawbloodsplash(x:integer; y:integer); procedure gamescreenClick(Sender: TObject); function directlinedirection(source:integer; target:integer):integer; private public end; type tworldtile=record content:array[0..9] of integer; sector:integer; end; type tworldobject=record //Engine activation:bool; position:array[0..2] of integer; objecttype:integer; lastattacker:integer; lastvictim:integer; finaldestination:array[0..1]of integer; target:integer; courage:integer; fear:integer; //Equipment item:array[0..4]of integer; //0:Armor(Helmet) 1:Weapon1, 2:Weapon2, 3:Item1, 4:Item2 //Properties hp:integer; shooting:integer; closecombat:integer; //Military side:integer; rank:integer; dutytime:integer; missions:integer; kills:array[0..2]of integer; //0:Close; 1:Distance; 2:Damage! end; var Form1: TForm1; observerposition:array[0..1]of integer; worldtile:array[0..99, 0..99] of tworldtile; worldobject:array[0..999] of tworldobject; gamescreensize, levelactors, levelobjects, levelsize, player, worldtilesize:integer; sidecolor:array[0..2] of tcolor; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - implementation {$R *.dfm} //------------------------------------------------------------------------------ // FORM CREATE //------------------------------------------------------------------------------ procedure TForm1.FormCreate(Sender: TObject); begin randomize; worldtilesize:=11; //MUST BE ODD! sidecolor[0]:=clgray; sidecolor[1]:=clgreen; sidecolor[2]:=clnavy; end; //------------------------------------------------------------------------------ // LAMEHUD BUTTONS //------------------------------------------------------------------------------ procedure TForm1.Panel1Click(Sender: TObject); begin panel1.visible:=false; panel2.visible:=false; settinglevelsize.visible:=false; settinglevelactors.visible:=false; settinggamescreensize.visible:=false; settinglevelwallpercentage.visible:=false; missionpanel.visible:=true; debugmemo1.visible:=true; form1.top:=50; form1.left:=50; entermission(); end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - procedure TForm1.Panel2Click(Sender: TObject); begin close; end; //------------------------------------------------------------------------------ // ENTER MISSION //------------------------------------------------------------------------------ procedure TForm1.entermission(); begin gamescreensize:=strtoint(settinggamescreensize.text); //MUST BE ODD! //---Arrange GUI--- missionpanel.top:=1; missionpanel.left:=1; gamescreen.top:=0; gamescreen.left:=0; gamescreen.width:=worldtilesize*gamescreensize; gamescreen.height:=gamescreen.width; gamescreen.canvas.brush.style:=bssolid; gamescreen.canvas.pen.style:=pssolid; missionpanel.width:=gamescreen.width; missionpanel.height:=gamescreen.height; debugmemo1.top:=1; debugmemo1.left:=missionpanel.width+2; debugmemo1.width:=200; debugmemo1.height:=missionpanel.height; form1.width:=missionpanel.width+debugmemo1.width+3; form1.height:=missionpanel.height+2; userinput.left:=missionpanel.width+10; userinput.top:=missionpanel.height+10; //---Mission parameters--- levelsize:=strtoint(settinglevelsize.text); generatelevel(); drawgamescreen(); missionturncycle(1); end; //------------------------------------------------------------------------------ // REGAIN CONTROL //------------------------------------------------------------------------------ procedure TForm1.gamescreenClick(Sender: TObject); begin userinput.setfocus; end; //============================================================================== // LEVEL GENERATOR //============================================================================== procedure TForm1.generatelevel(); var filltile, i, x, y:integer; begin //---Init variables--- for y:=0 to 99 do begin for x:=0 to 99 do begin with worldtile[x,y] do begin for i:=0 to 9 do content[i]:=0; sector:=0; end; end; end; for i:=0 to 999 do begin with worldobject[i] do begin //Engine activation:=false; objecttype:=1; position[0]:=0; position[1]:=0; position[2]:=3; lastattacker:=0; lastvictim:=0; finaldestination[0]:=0; finaldestination[1]:=0; target:=0; fear:=0; courage:=0; //Statistics hp:=100; closecombat:=1; shooting:=1; //Equipment item[0]:=0; item[1]:=0; item[2]:=0; item[3]:=0; item[4]:=0; //Military side:=0; rank:=0; dutytime:=0; missions:=0; kills[0]:=0; kills[1]:=0; kills[2]:=0; end; end; observerposition[0]:=trunc((levelsize)/2); observerposition[1]:=trunc((levelsize)/2); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - drawgamescreen(); showmessage('Random level...'); //---Generate a standard wall content level pattern--- for y:=0 to levelsize do begin for x:=0 to levelsize do begin if random(100)0 then if worldtile[x,y-1].content[0]<>0 then inc(filltile); if x0 then inc(filltile); if y0 then inc(filltile); if x>0 then if worldtile[x-1,y].content[0]<>0 then inc(filltile); if filltile>2 then worldtile[x,y].content[0]:=1; end; end; until (i=4); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Insert actors--- levelactors:=strtoint(settinglevelactors.text); levelobjects:=strtoint(settinglevelactors.text); player:=random(levelactors)+1; for i:=1 to levelactors do begin with worldobject[i] do begin activation:=true; repeat position[0]:=random(levelsize); position[1]:=random(levelsize); until(worldtile[position[0],position[1]].content[0]=0) and (worldtile[position[0],position[1]].content[1]=0); position[2]:=random(4)+1; item[0]:=random(4)+1; side:=random(2)+1; rank:=random(12); end; worldtile[worldobject[i].position[0],worldobject[i].position[1]].content[1]:=i; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Engine related--- observerposition[0]:=worldobject[player].position[0]; observerposition[1]:=worldobject[player].position[1]; end; //============================================================================== // MISSION TURN CYCLE (& AI) //============================================================================== procedure TForm1.missionturncycle(actingactor:integer); var i, threatdistance:integer; targetpositionvalue:array[0..1,0..1]of integer; //[0&1:x&y] [0:Distance; 1:Direction (Helpful at objectmover call);] begin while (actingactor<>player) do begin if worldobject[actingactor].hp>0 then begin //---Check if last target is living--- if worldobject[worldobject[actingactor].target].hp<=0 then worldobject[actingactor].target:=0; //---Check for close attackers--- threatdistance:=(worldobject[actingactor].position[0]-worldobject[worldobject[actingactor].lastattacker].position[0])*(worldobject[actingactor].position[1]-worldobject[worldobject[actingactor].lastattacker].position[1]); if threatdistance<0 then threatdistance:=threatdistance*(-1); if (threatdistance<=4) and (worldobject[worldobject[actingactor].lastattacker].hp>0) and (worldobject[worldobject[actingactor].lastattacker].side<>worldobject[actingactor].side) then worldobject[actingactor].target:=worldobject[actingactor].lastattacker; //See what's next to do... if worldobject[actingactor].target<>0 then //Active target! begin //Check distance and direction... targetpositionvalue[0,0]:=0; targetpositionvalue[0,1]:=0; targetpositionvalue[1,0]:=0; targetpositionvalue[1,1]:=0; if worldobject[worldobject[actingactor].target].position[0]>worldobject[actingactor].position[0] then begin targetpositionvalue[0,0]:=worldobject[worldobject[actingactor].target].position[0]-worldobject[actingactor].position[0]; targetpositionvalue[0,1]:=2; end else begin targetpositionvalue[0,0]:=worldobject[actingactor].position[0]-worldobject[worldobject[actingactor].target].position[0]; targetpositionvalue[0,1]:=4; end; if worldobject[worldobject[actingactor].target].position[1]>worldobject[actingactor].position[1] then begin targetpositionvalue[1,0]:=worldobject[worldobject[actingactor].target].position[1]-worldobject[actingactor].position[1]; targetpositionvalue[1,1]:=3; end else begin targetpositionvalue[1,0]:=worldobject[actingactor].position[1]-worldobject[worldobject[actingactor].target].position[1]; targetpositionvalue[1,1]:=1; end; //Consequences of target knowledge... if (targetpositionvalue[0,0]<>0) and (targetpositionvalue[1,0]<>0) then //Actor picks new move direction randomly... begin if random(2)=0 then begin worldobject[actingactor].position[2]:=targetpositionvalue[0,1]; objectmover(actingactor,targetpositionvalue[0,1]) end else begin worldobject[actingactor].position[2]:=targetpositionvalue[1,1]; objectmover(actingactor,targetpositionvalue[1,1]) end; end else //Only one direction is correct... begin if (targetpositionvalue[0,0]<>0) then begin worldobject[actingactor].position[2]:=targetpositionvalue[0,1]; objectmover(actingactor,targetpositionvalue[0,1]) end else begin worldobject[actingactor].position[2]:=targetpositionvalue[1,1]; objectmover(actingactor,targetpositionvalue[1,1]) end; end; end else //No active target. begin if random(4)=0 then //Random target! begin for i:=1 to levelobjects do begin if (i<>actingactor) and (worldobject[i].hp>0) and (worldobject[i].side<>worldobject[actingactor].side) then begin worldobject[actingactor].target:=i; break; end; end; end else //Herumdödeln... begin if random(8)=0 then worldobject[actingactor].position[2]:=random(4)+1; if random(4)<>0 then objectmover(actingactor,worldobject[actingactor].position[2]) else if random(4)<>0 then else objectmover(actingactor,random(4)+1); end; end; end; inc(actingactor); if actingactor>levelobjects then actingactor:=1; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if worldobject[player].hp<=0 then killactor(player); drawgamescreen(); userinput.readonly:=false; userinput.SetFocus; end; //============================================================================== // CLOSE COMBAT //============================================================================== procedure TForm1.closecombat(attacker:integer; defender:integer); var closecombatdamage, i:integer; begin worldobject[attacker].lastvictim:=defender; worldobject[defender].lastattacker:=attacker; closecombatdamage:=0; i:=0; repeat closecombatdamage:=closecombatdamage+trunc(random(worldobject[attacker].hp)/4); inc(i); until(i=worldobject[attacker].closecombat); if directlinedirection(defender, attacker)<>worldobject[defender].position[2] then closecombatdamage:=closecombatdamage*2; worldobject[defender].hp:=worldobject[defender].hp-closecombatdamage; if worldobject[defender].item[0]>1 then closecombatdamage:=closecombatdamage-random(10*(worldobject[defender].item[0]-1)); if closecombatdamage<0 then closecombatdamage:=0; //debugmemo1.lines.add('['+inttostr(attacker)+'] deals '+inttostr(closecombatdamage)+' damage to ['+inttostr(defender)+']'); if worldobject[defender].hp<=0 then killactor(defender); end; //============================================================================== // DIRECT LINE DIRECTION //============================================================================== function TForm1.directlinedirection(source:integer; target:integer):integer; begin if worldobject[source].position[0]=worldobject[target].position[0] then //Both on same x-value! begin if worldobject[target].position[1]worldobject[source].position[0] then result:=2 else result:=4; end else begin //No direct line direction. result:=0; showmessage('Someone asked for a line of sight detection where there is no...'); end; end; end; //============================================================================== // KILLACTOR //============================================================================== procedure TForm1.killactor(newdeadactor:integer); begin worldobject[newdeadactor].objecttype:=2; debugmemo1.lines.add('['+inttostr(newdeadactor)+'] died.'); end; //============================================================================== // OBJECT MOVER //============================================================================== procedure TForm1.objectmover(movingactor:integer; direction:integer); var move:boolean; destination_x, destination_y, movingactoriscontent, movingactorwillbecontent, x_value, y_value, i:integer; begin x_value:=0; y_value:=0; move:=true; if direction=1 then dec(y_value); if direction=2 then inc(x_value); if direction=3 then inc(y_value); if direction=4 then dec(x_value); destination_x:=worldobject[movingactor].position[0]+x_value; destination_y:=worldobject[movingactor].position[1]+y_value; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if (destination_x<0) or (destination_x>levelsize) or (destination_y<0) or (destination_y>levelsize) or (worldtile[destination_x,destination_y].content[0]=1) then move:=false else //---Check for actors and eventual close combat--- begin for i:=1 to 9 do begin if (worldtile[destination_x,destination_y].content[i]<>0) and (worldobject[worldtile[destination_x,destination_y].content[i]].objecttype=1) then begin if worldobject[worldtile[destination_x,destination_y].content[i]].side<>worldobject[movingactor].side then closecombat(movingactor, worldtile[destination_x,destination_y].content[i]); move:=false; break; end; end; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if move=true then begin //---Move content 1 object from a worldtile to another--- movingactoriscontent:=0; for i:=1 to 9 do begin if worldtile[worldobject[movingactor].position[0],worldobject[movingactor].position[1]].content[i]=movingactor then movingactoriscontent:=i; if movingactoriscontent<>0 then break; end; movingactorwillbecontent:=0; for i:=1 to 9 do begin if worldtile[destination_x,destination_y].content[i]=0 then movingactorwillbecontent:=i; if movingactorwillbecontent<>0 then break; end; worldtile[destination_x,destination_y].content[movingactorwillbecontent]:=movingactor; worldtile[worldobject[movingactor].position[0],worldobject[movingactor].position[1]].content[movingactoriscontent]:=0; worldobject[movingactor].position[0]:=destination_x; worldobject[movingactor].position[1]:=destination_y; end; end; //============================================================================== // USER INTERFACE COLTROLLER //============================================================================== procedure TForm1.userinputChange(Sender: TObject); var nomoreactions:bool; begin userinput.readonly:=true; nomoreactions:=false; if ((userinput.text='w') or (userinput.text='d') or (userinput.text='s') or (userinput.text='a') or (userinput.text='W') or (userinput.text='D') or (userinput.text='S') or (userinput.text='A') or (userinput.text='q')) and (worldobject[player].hp>0) then begin if userinput.text='w' then if worldobject[player].position[2]=1 then begin objectmover(player,1); nomoreactions:=true; end else worldobject[player].position[2]:=1; if userinput.text='W' then begin objectmover(player,1); nomoreactions:=true; end; if userinput.text='d' then if worldobject[player].position[2]=2 then begin objectmover(player,2); nomoreactions:=true; end else worldobject[player].position[2]:=2; if userinput.text='D' then begin objectmover(player,2); end; if userinput.text='s' then if worldobject[player].position[2]=3 then begin objectmover(player,3); nomoreactions:=true; end else worldobject[player].position[2]:=3; if userinput.text='S' then begin objectmover(player,3); nomoreactions:=true; end; if userinput.text='a' then if worldobject[player].position[2]=4 then begin objectmover(player,4); nomoreactions:=true; end else worldobject[player].position[2]:=4; if userinput.text='A' then begin objectmover(player,4); nomoreactions:=true; end; if userinput.text='q' then nomoreactions:=true; userinput.text:=''; end; if nomoreactions=true then begin missionturncycle(player+1); end else begin userinput.readonly:=false; userinput.setfocus; observerposition[0]:=worldobject[player].position[0]; observerposition[1]:=worldobject[player].position[1]; drawgamescreen(); end; end; //============================================================================== // GAME SCREEN DRAWER //============================================================================== procedure TForm1.drawgamescreen(); var outworld:bool; i, objectdrawposition_x, objectdrawposition_y, scannedobject, scannedposition_x, scannedposition_y, x, y:integer; begin for y:=0 to gamescreensize do begin for x:=0 to gamescreensize do begin scannedposition_x:=trunc(observerposition[0]-((gamescreensize-1)/2)+x); scannedposition_y:=trunc(observerposition[1]-((gamescreensize-1)/2)+y); //---Scan for worldtile content "0" (terraintype)--- if (scannedposition_x<0) or (scannedposition_x>levelsize) or (scannedposition_y<0) or (scannedposition_y>levelsize) then begin gamescreen.canvas.brush.color:=clblack; outworld:=true end else begin if worldtile[scannedposition_x,scannedposition_y].content[0]=0 then gamescreen.canvas.brush.color:=clsilver; if worldtile[scannedposition_x,scannedposition_y].content[0]=1 then gamescreen.canvas.brush.color:=clgray; outworld:=false; end; //---Perform actual worldtile-drawing on gamescreen gamescreen.canvas.pen.color:=gamescreen.canvas.brush.color; gamescreen.canvas.rectangle((0+worldtilesize*x),(0+worldtilesize*y),(worldtilesize+worldtilesize*x),(worldtilesize+worldtilesize*y)); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Scan for all worldtile contents--- for i:=1 to 9 do begin if (worldtile[scannedposition_x,scannedposition_y].content[i]<>0) and (outworld=false) then begin objectdrawposition_x:=x*worldtilesize; objectdrawposition_y:=y*worldtilesize; scannedobject:=worldtile[scannedposition_x,scannedposition_y].content[i]; if (worldobject[scannedobject].activation=true) then begin if (worldobject[scannedobject].objecttype=2) then drawbloodsplash(objectdrawposition_x, objectdrawposition_y); if (worldobject[scannedobject].objecttype=1) then begin //---Draw Chipchip--- drawchipchip(worldobject[scannedobject].position[2], objectdrawposition_x, objectdrawposition_y); //---Draw helmet--- if worldobject[scannedobject].item[0]<>0 then drawhelmet(worldobject[scannedobject].item[0], sidecolor[worldobject[scannedobject].side], worldobject[scannedobject].position[2], objectdrawposition_x, objectdrawposition_y); //---Draw emblem--- if worldobject[scannedobject].rank>5 then begin if worldobject[scannedobject].position[2]=2 then gamescreen.canvas.pixels[objectdrawposition_x+7,objectdrawposition_y+2]:=clwhite; if worldobject[scannedobject].position[2]=3 then gamescreen.canvas.pixels[objectdrawposition_x+5,objectdrawposition_y+2]:=clwhite; if worldobject[scannedobject].position[2]=4 then gamescreen.canvas.pixels[objectdrawposition_x+3,objectdrawposition_y+2]:=clwhite; end; end; end; end; end; end end; //---Draw Bar-HUD--- gamescreen.canvas.pixels[2,gamescreen.height-3]:=clmaroon; gamescreen.canvas.pixels[3,gamescreen.height-3]:=clmaroon; gamescreen.canvas.pixels[4,gamescreen.height-3]:=clmaroon; gamescreen.canvas.pixels[5,gamescreen.height-3]:=clmaroon; for y:=0 to 100 do begin gamescreen.canvas.pixels[2,gamescreen.height-4-y]:=clmaroon; if worldobject[player].hp>=y then begin gamescreen.canvas.pixels[3,gamescreen.height-4-y]:=clred; gamescreen.canvas.pixels[4,gamescreen.height-4-y]:=clred; end else begin gamescreen.canvas.pixels[3,gamescreen.height-4-y]:=clmaroon; gamescreen.canvas.pixels[4,gamescreen.height-4-y]:=clmaroon; end; gamescreen.canvas.pixels[5,gamescreen.height-4-y]:=clmaroon; end; gamescreen.canvas.pixels[2,gamescreen.height-105]:=clmaroon; gamescreen.canvas.pixels[3,gamescreen.height-105]:=clmaroon; gamescreen.canvas.pixels[4,gamescreen.height-105]:=clmaroon; gamescreen.canvas.pixels[5,gamescreen.height-105]:=clmaroon; gamescreen.refresh(); end; //------------------------------------------------------------------------------ // DRAW BLOODSPLASH //------------------------------------------------------------------------------ procedure TForm1.drawbloodsplash(x:integer; y:integer); begin gamescreen.canvas.pixels[x+3,y+8]:=clred; gamescreen.canvas.pixels[x+4,y+8]:=clred; gamescreen.canvas.pixels[x+5,y+8]:=clred; gamescreen.canvas.pixels[x+6,y+8]:=clred; gamescreen.canvas.pixels[x+7,y+8]:=clred; gamescreen.canvas.pixels[x+8,y+8]:=clred; gamescreen.canvas.pixels[x+1,y+9]:=clred; gamescreen.canvas.pixels[x+4,y+9]:=clred; gamescreen.canvas.pixels[x+5,y+9]:=clred; gamescreen.canvas.pixels[x+6,y+9]:=clred; gamescreen.canvas.pixels[x+9,y+9]:=clred; gamescreen.canvas.pixels[x+8,y+10]:=clred; gamescreen.canvas.pixels[x+2,y+11]:=clred; gamescreen.canvas.pixels[x+3,y+11]:=clred; gamescreen.canvas.pixels[x+5,y+11]:=clred; end; //------------------------------------------------------------------------------ // DRAW CHIP CHIP //------------------------------------------------------------------------------ procedure TForm1.drawchipchip(direction:integer; x:integer; y:integer); begin //---Draw basic yellow ChipChip actor area gamescreen.canvas.pixels[x+4,y+2]:=clyellow; gamescreen.canvas.pixels[x+5,y+2]:=clyellow; gamescreen.canvas.pixels[x+6,y+2]:=clyellow; gamescreen.canvas.pixels[x+3,y+3]:=clyellow; gamescreen.canvas.pixels[x+4,y+3]:=clyellow; gamescreen.canvas.pixels[x+5,y+3]:=clyellow; gamescreen.canvas.pixels[x+6,y+3]:=clyellow; gamescreen.canvas.pixels[x+7,y+3]:=clyellow; gamescreen.canvas.pixels[x+3,y+4]:=clyellow; gamescreen.canvas.pixels[x+4,y+4]:=clyellow; gamescreen.canvas.pixels[x+5,y+4]:=clyellow; gamescreen.canvas.pixels[x+6,y+4]:=clyellow; gamescreen.canvas.pixels[x+7,y+4]:=clyellow; gamescreen.canvas.pixels[x+3,y+5]:=clyellow; gamescreen.canvas.pixels[x+4,y+5]:=clyellow; gamescreen.canvas.pixels[x+5,y+5]:=clyellow; gamescreen.canvas.pixels[x+6,y+5]:=clyellow; gamescreen.canvas.pixels[x+7,y+5]:=clyellow; gamescreen.canvas.pixels[x+3,y+6]:=clyellow; gamescreen.canvas.pixels[x+4,y+6]:=clyellow; gamescreen.canvas.pixels[x+5,y+6]:=clyellow; gamescreen.canvas.pixels[x+6,y+6]:=clyellow; gamescreen.canvas.pixels[x+7,y+6]:=clyellow; gamescreen.canvas.pixels[x+3,y+7]:=clyellow; gamescreen.canvas.pixels[x+4,y+7]:=clyellow; gamescreen.canvas.pixels[x+5,y+7]:=clyellow; gamescreen.canvas.pixels[x+6,y+7]:=clyellow; gamescreen.canvas.pixels[x+7,y+7]:=clyellow; gamescreen.canvas.pixels[x+4,y+8]:=clyellow; gamescreen.canvas.pixels[x+5,y+8]:=clyellow; gamescreen.canvas.pixels[x+6,y+8]:=clyellow; //---Draw ChipChip face based on direction //---Direction 1 has no face: Face turned off observer.--- if direction=2 then begin gamescreen.canvas.pixels[x+7,y+4]:=clblack; gamescreen.canvas.pixels[x+6,y+6]:=clblack; gamescreen.canvas.pixels[x+7,y+6]:=clblack; end; if direction=3 then begin gamescreen.canvas.pixels[x+4,y+4]:=clblack; gamescreen.canvas.pixels[x+6,y+4]:=clblack; gamescreen.canvas.pixels[x+4,y+6]:=clblack; gamescreen.canvas.pixels[x+5,y+6]:=clblack; gamescreen.canvas.pixels[x+6,y+6]:=clblack; end; if direction=4 then begin gamescreen.canvas.pixels[x+3,y+4]:=clblack; gamescreen.canvas.pixels[x+3,y+6]:=clblack; gamescreen.canvas.pixels[x+4,y+6]:=clblack; end; end; //------------------------------------------------------------------------------ // DRAW HELMETS //------------------------------------------------------------------------------ procedure TForm1.drawhelmet(helmettype:integer; helmetcolor:tcolor; direction:integer; x:integer; y:integer); begin //---Here, helmet must be at least 1!--- gamescreen.canvas.pixels[x+3,y+3]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+3]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+3]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+3]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+3]:=helmetcolor; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Barett--- if direction=2 then begin gamescreen.canvas.pixels[x+4,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+2]:=helmetcolor; end else begin if direction=4 then begin gamescreen.canvas.pixels[x+3,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+2]:=helmetcolor; end else begin gamescreen.canvas.pixels[x+3,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+2]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+2]:=helmetcolor; end; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Standard helmet--- if helmettype>=2 then begin gamescreen.canvas.pixels[x+4,y+1]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+1]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+1]:=helmetcolor; if direction=2 then gamescreen.canvas.pixels[x+3,y+2]:=helmetcolor; if direction=4 then gamescreen.canvas.pixels[x+7,y+2]:=helmetcolor; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Medium helmet--- if helmettype>=3 then begin if direction=1 then begin gamescreen.canvas.pixels[x+3,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+4]:=helmetcolor; end; if direction=2 then begin gamescreen.canvas.pixels[x+3,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+4]:=helmetcolor; end; if direction=3 then begin gamescreen.canvas.pixels[x+3,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+4]:=helmetcolor; end; if direction=4 then begin gamescreen.canvas.pixels[x+5,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+4]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+4]:=helmetcolor; end; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - //---Assault armor--- if helmettype=4 then begin gamescreen.canvas.pixels[x+3,y+5]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+5]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+5]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+5]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+5]:=helmetcolor; if direction=2 then begin gamescreen.canvas.pixels[x+6,y+6]:=helmetcolor; gamescreen.canvas.pixels[x+7,y+6]:=helmetcolor; //visier... gamescreen.canvas.pixels[x+5,y+3]:=clblack; gamescreen.canvas.pixels[x+6,y+3]:=clblack; gamescreen.canvas.pixels[x+7,y+3]:=clblack; gamescreen.canvas.pixels[x+6,y+4]:=clblack; gamescreen.canvas.pixels[x+7,y+4]:=clblack; end; if direction=3 then begin gamescreen.canvas.pixels[x+4,y+6]:=helmetcolor; gamescreen.canvas.pixels[x+5,y+6]:=helmetcolor; gamescreen.canvas.pixels[x+6,y+6]:=helmetcolor; //visier... gamescreen.canvas.pixels[x+3,y+3]:=clblack; gamescreen.canvas.pixels[x+4,y+3]:=clblack; gamescreen.canvas.pixels[x+5,y+3]:=clblack; gamescreen.canvas.pixels[x+6,y+3]:=clblack; gamescreen.canvas.pixels[x+7,y+3]:=clblack; gamescreen.canvas.pixels[x+4,y+4]:=clblack; gamescreen.canvas.pixels[x+5,y+4]:=clblack; gamescreen.canvas.pixels[x+6,y+4]:=clblack; end; if direction=4 then begin gamescreen.canvas.pixels[x+3,y+6]:=helmetcolor; gamescreen.canvas.pixels[x+4,y+6]:=helmetcolor; //visier... gamescreen.canvas.pixels[x+3,y+3]:=clblack; gamescreen.canvas.pixels[x+4,y+3]:=clblack; gamescreen.canvas.pixels[x+5,y+3]:=clblack; gamescreen.canvas.pixels[x+3,y+4]:=clblack; gamescreen.canvas.pixels[x+4,y+4]:=clblack; end; end; end; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - end.