12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277 |
- /*
- Copyright (C) 2005, 2010 - Cryptic Sea
- This file is part of Gish.
- Gish is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- */
- void createbox(float position[3],float sizex,float sizey,float mass,float friction)
- {
- int count,count2;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=2;
- object[numofobjects].timetolive=10000;
- object[numofobjects].mass=mass;
- object[numofobjects].numofparticles=4;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.5f;
- else
- object[numofobjects].radius=sizey*1.5f;
- object[numofobjects].size[0]=sizex;
- object[numofobjects].size[1]=sizey;
- object[numofobjects].friction=friction;
- count=0;
- vec[0]=-sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=-sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- for (count=0;count<object[numofobjects].numofparticles;count++)
- for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,-1);
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=4;
- for (count=0;count<4;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&3);
- }
- object[numofobjects].texcoord[0][0]=0.0f;
- object[numofobjects].texcoord[0][1]=0.0f;
- object[numofobjects].texcoord[1][0]=1.0f;
- object[numofobjects].texcoord[1][1]=0.0f;
- object[numofobjects].texcoord[2][0]=1.0f;
- object[numofobjects].texcoord[2][1]=1.0f;
- object[numofobjects].texcoord[3][0]=0.0f;
- object[numofobjects].texcoord[3][1]=1.0f;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createtarboy(float position[3])
- {
- int count;
- float vec[3];
- float angle;
- float size;
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=1;
- object[numofobjects].timetolive=10000;
- object[numofobjects].radius=1.5f;
- object[numofobjects].mass=4.0f;
- object[numofobjects].friction=1.2f;
- if (numofobjects==0)
- object[numofobjects].direction=1;
- object[numofobjects].hitpoints=1000;
- object[numofobjects].numofparticles=16;
- for (count=0;count<16;count++)
- {
- angle=(float)count*pi/8.0f;
- size=0.9f;
- if (game.supersize)
- size=0.9f*1.25f;
- if (game.difficulty==4)
- size=0.9f*0.8f;
- vec[0]=position[0]+cos(angle)*size;
- vec[1]=position[1]-sin(angle)*size;
- vec[2]=0.0f;
- createparticle(1,vec,NULL,0.25f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- }
- for (count=0;count<16;count++)
- {
- createbond(object[numofobjects].particle[((count+1)&15)],object[numofobjects].particle[(count&15)],3,-1);
- createbond(object[numofobjects].particle[((count+2)&15)],object[numofobjects].particle[(count&15)],3,-1);
- createbond(object[numofobjects].particle[((count+8)&15)],object[numofobjects].particle[(count&15)],2,numofobjects);
- }
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=16;
- for (count=0;count<16;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&15);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createwheel(float position[3],float sizex,float sizey,float mass,float friction,int anchor)
- {
- int count;
- float vec[3];
- float angle;
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=3;
- object[numofobjects].timetolive=10000;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.25f;
- else
- object[numofobjects].radius=sizey*1.25f;
- object[numofobjects].mass=mass;
- object[numofobjects].friction=friction;
- object[numofobjects].numofparticles=17;
- for (count=0;count<16;count++)
- {
- angle=(float)count*pi/8.0f;
- vec[0]=position[0]+cos(angle)*sizex*0.5f;
- vec[1]=position[1]-sin(angle)*sizey*0.5f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/20.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- }
- count=16;
- if (!anchor)
- createparticle(3,position,NULL,mass/5.0f,numofobjects,10000);
- else
- createparticle(2,position,NULL,mass/5.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- for (count=0;count<16;count++)
- {
- createbond(object[numofobjects].particle[((count+1)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
- createbond(object[numofobjects].particle[((count+2)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
- createbond(object[numofobjects].particle[((count+3)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
- //createbond(object[numofobjects].particle[((count+4)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
- //createbond(object[numofobjects].particle[((count+8)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
- createbond(object[numofobjects].particle[16],object[numofobjects].particle[(count&15)],1,numofobjects);
- }
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=16;
- for (count=0;count<16;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&15);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void setupobjecttypes(void)
- {
- int count;
- count=1;
- objecttype[count].collide[1]=1;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=2;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=3;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=4;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=5;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=6;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- count=9;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=0;
- objecttype[count].collide[10]=0;
- objecttype[count].collide[20]=1;
- count=10;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=0;
- objecttype[count].collide[10]=0;
- objecttype[count].collide[20]=1;
- count=20;
- objecttype[count].collide[1]=0;
- objecttype[count].collide[2]=1;
- objecttype[count].collide[3]=1;
- objecttype[count].collide[4]=1;
- objecttype[count].collide[5]=1;
- objecttype[count].collide[6]=1;
- objecttype[count].collide[9]=1;
- objecttype[count].collide[10]=1;
- objecttype[count].collide[20]=1;
- }
- void createrope(int type,int particlenum,int particlenum2,int objectnum,int objectnum2,int texturenum)
- {
- int count,count2;
- int length;
- float vec[3],vec2[3];
- float mass;
- if (type<5)
- {
- if (type==1)
- mass=0.125f;
- if (type==2)
- mass=0.25f;
- if (type==3)
- mass=1.0f;
- if (type==4)
- mass=2.0f;
- subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position);
- length=vectorlength(vec);
- if (length<1)
- length=1;
- length*=2;
-
- scalevector(vec,vec,1.0f/(float)length);
- copyvector(vec2,particle[particlenum].position);
- addvectors(vec2,vec2,vec);
- createparticle(4,vec2,NULL,mass,-1,10000);
- createbond(particlenum,numofparticles-1,4,numofropes);
- rope[numofropes].type=type;
- rope[numofropes].part1=particlenum;
- rope[numofropes].part2=numofparticles-1;
- if (type<3)
- rope[numofropes].texturenum=360;
- else
- rope[numofropes].texturenum=361;
- numofropes++;
-
- for (count=1;count<length-1;count++)
- {
- addvectors(vec2,vec2,vec);
- createparticle(4,vec2,NULL,mass,-1,10000);
- createbond(numofparticles-2,numofparticles-1,4,numofropes);
- rope[numofropes].type=type;
- rope[numofropes].part1=numofparticles-2;
- rope[numofropes].part2=numofparticles-1;
- if (type<3)
- rope[numofropes].texturenum=360;
- else
- rope[numofropes].texturenum=361;
- numofropes++;
- }
- createbond(numofparticles-1,particlenum2,4,numofropes);
- rope[numofropes].type=type;
- rope[numofropes].part1=numofparticles-1;
- rope[numofropes].part2=particlenum2;
- if (type<3)
- rope[numofropes].texturenum=360;
- else
- rope[numofropes].texturenum=361;
- numofropes++;
- }
- else
- {
- if (type<10)
- createbond(particlenum,particlenum2,7,numofropes);
- else
- createbond(particlenum,particlenum2,8,numofropes);
- if (type<9)
- {
- if (level.object[objectnum2].type==6 || level.object[objectnum2].type==7)
- {
- subtractvectors(vec,level.object[objectnum2].position,particle[particlenum].position);
- subtractvectors(vec2,particle[particlenum2].position,object[objectnum2].position);
- rope[numofropes].range=vectorlength(vec2);
-
- bond[numofbonds-1].length=vectorlength(vec)-rope[numofropes].range;
- bond[numofbonds-1].maxlength=vectorlength(vec)-rope[numofropes].range;
- }
- if (level.object[objectnum2].type>=2 && level.object[objectnum2].type<6)
- {
- subtractvectors(vec2,level.object[objectnum2].position,object[objectnum].position);
- subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position);
-
- if (fabs(vec2[0])>fabs(vec2[1]))
- vec[1]=0.0f;
- else
- vec[0]=0.0f;
-
- normalizevector(vec,vec);
-
- if (type==5 || type==9)
- copyvector(vec2,particle[particlenum2].position);
- if (type==6 || type==8)
- scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]*0.5f);
- if (type==7)
- scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]);
- subtractvectors(vec2,particle[particlenum].position,vec2);
- bond[numofbonds-1].length=vectorlength(vec2);
- bond[numofbonds-1].maxlength=vectorlength(vec2);
-
- if (type==5)
- scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]);
- if (type==6 || type==8)
- scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]*0.5f);
- if (type==7 || type==9)
- copyvector(vec2,particle[particlenum2].position);
- subtractvectors(vec2,particle[particlenum].position,vec2);
- rope[numofropes].range=(vectorlength(vec2)-bond[numofbonds-1].maxlength)*0.5f;
- }
- }
- rope[numofropes].type=type;
- rope[numofropes].part1=particlenum;
- rope[numofropes].part2=particlenum2;
- rope[numofropes].bondnum=numofbonds-1;
- if (type==5)
- rope[numofropes].angle=0.0f;
- if (type==6)
- rope[numofropes].angle=pi/2.0f;
- if (type==7)
- rope[numofropes].angle=pi;
- if (type==8)
- rope[numofropes].angle=3.0f*pi/2.0f;
- rope[numofropes].cycle=level.object[objectnum].lightcolor[1];
- rope[numofropes].cyclelength=level.object[objectnum].lightcolor[2];
- rope[numofropes].cyclecount=0.0f;
- rope[numofropes].link=level.object[objectnum].link;
- if (texturenum==0)
- rope[numofropes].texturenum=0;
- if (texturenum==1)
- rope[numofropes].texturenum=362;
- if (texturenum==2)
- rope[numofropes].texturenum=362;
- if (texturenum==3)
- rope[numofropes].texturenum=362;
- numofropes++;
- }
- }
- void createanchor(float position[3])
- {
- int count;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=8;
- object[numofobjects].timetolive=10000;
- object[numofobjects].radius=1.0f;
- object[numofobjects].friction=0.8f;
- object[numofobjects].numofparticles=0;
- copyvector(vec,position);
- vec[0]+=0.00001f;
- createparticle(2,position,NULL,10000.0f,numofobjects,10000);
- object[numofobjects].particle[0]=numofparticles-1;
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=0;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createbutton(float position[3],float mass)
- {
- int count,count2;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=9;
- object[numofobjects].timetolive=10000;
- object[numofobjects].friction=0.3f;
- object[numofobjects].radius=1.5f;
- object[numofobjects].numofparticles=7;
- count=0;
- vec[0]=position[0]-0.499f;
- vec[1]=position[1]+0.5f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0]-0.125f;
- vec[1]=position[1]+0.75f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0]+0.125f;
- vec[1]=position[1]+0.75f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0]+0.499f;
- vec[1]=position[1]+0.5f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0]+0.499f;
- vec[1]=position[1]-0.125f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0]-0.499f;
- vec[1]=position[1]-0.125f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=position[0];
- vec[1]=position[1]-0.125f;
- vec[2]=0.0f;
- createparticle(2,vec,NULL,1.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- for (count=0;count<6;count++)
- for (count2=count+1;count2<6;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects);
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=6;
- for (count=0;count<6;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)%6);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createswitch(float position[3],float mass,int rotate)
- {
- int count,count2;
- float vec[3],vec2[3];
- float orientation[2][2];
- if (rotate==0)
- {
- orientation[0][0]=1.0f;
- orientation[0][1]=0.0f;
- orientation[1][0]=0.0f;
- orientation[1][1]=1.0f;
- }
- if (rotate==1)
- {
- orientation[0][0]=0.0f;
- orientation[0][1]=-1.0f;
- orientation[1][0]=1.0f;
- orientation[1][1]=0.0f;
- }
- if (rotate==2)
- {
- orientation[0][0]=-1.0f;
- orientation[0][1]=0.0f;
- orientation[1][0]=0.0f;
- orientation[1][1]=-1.0f;
- }
- if (rotate==3)
- {
- orientation[0][0]=0.0f;
- orientation[0][1]=-1.0f;
- orientation[1][0]=-1.0f;
- orientation[1][1]=0.0f;
- }
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=10;
- object[numofobjects].timetolive=10000;
- object[numofobjects].radius=1.5f;
- object[numofobjects].friction=0.3f;
- object[numofobjects].rotate=rotate;
- object[numofobjects].numofparticles=5;
- count=0;
- vec[0]=-0.875f;
- vec[1]=0.875f;
- vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
- vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
- vec2[2]=0.0f;
- createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=0.25f;
- vec[1]=0.0f;
- vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
- vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
- vec2[2]=0.0f;
- createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=-0.25f;
- vec[1]=-0.5f;
- vec[2]=0.0f;
- vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
- vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
- vec2[2]=0.0f;
- createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=-1.125f;
- vec[1]=0.625f;
- vec[2]=0.0f;
- vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
- vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
- vec2[2]=0.0f;
- createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- vec[0]=0.0f;
- vec[1]=-0.25f;
- vec[2]=0.0f;
- vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
- vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
- vec2[2]=0.0f;
- createparticle(2,vec2,NULL,10000.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- count++;
- for (count=0;count<5;count++)
- for (count2=count+1;count2<5;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects);
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=4;
- for (count=0;count<4;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- if (rotate!=3)
- object[numofobjects].cdline[count][1]=((count+1)&3);
- else
- object[numofobjects].cdline[count][1]=((count-1)&3);
- }
- object[numofobjects].texcoord[0][0]=0.0f;
- object[numofobjects].texcoord[0][1]=0.0f;
- object[numofobjects].texcoord[1][0]=1.0f;
- object[numofobjects].texcoord[1][1]=0.0f;
- object[numofobjects].texcoord[2][0]=1.0f;
- object[numofobjects].texcoord[2][1]=1.0f;
- object[numofobjects].texcoord[3][0]=0.0f;
- object[numofobjects].texcoord[3][1]=1.0f;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createbeast(int beasttype,float position[3],float sizex,float sizey,float mass,float friction)
- {
- int count,count2;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=4;
- object[numofobjects].timetolive=10000;
- object[numofobjects].beasttype=beasttype;
- object[numofobjects].animationnum=beasttype;
- object[numofobjects].texturenum=animation[object[numofobjects].animationnum].stand[0];
- object[numofobjects].mass=mass;
- object[numofobjects].hitpoints=250;
- if (beasttype==7 || beasttype==13)
- object[numofobjects].hitpoints=15000;
- object[numofobjects].size[0]=sizex;
- object[numofobjects].size[1]=sizey;
- object[numofobjects].numofparticles=4;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.5f;
- else
- object[numofobjects].radius=sizey*1.5f;
- object[numofobjects].friction=friction;
- count=0;
- vec[0]=-sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.5f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.5f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- if (beasttype!=12)
- createparticle(3,vec,NULL,mass*0.5f,-1,10000);
- else
- createparticle(2,vec,NULL,mass*0.5f,-1,10000);
- vec[0]=-sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- if (beasttype!=12)
- createparticle(3,vec,NULL,mass*0.5f,-1,10000);
- else
- createparticle(2,vec,NULL,mass*0.5f,-1,10000);
- for (count=0;count<object[numofobjects].numofparticles;count++)
- for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],6,numofobjects);
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=4;
- for (count=0;count<4;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&3);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createbobble(int beasttype,float position[3],float sizex,float sizey,float mass,float friction)
- {
- int count,count2;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=4;
- object[numofobjects].timetolive=10000;
- object[numofobjects].mass=mass;
- object[numofobjects].beasttype=beasttype;
- if (beasttype==1)
- object[numofobjects].texturenum=500;
- if (beasttype==2)
- object[numofobjects].texturenum=540;
- object[numofobjects].numofparticles=6;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.5f;
- else
- object[numofobjects].radius=sizey*1.5f;
- object[numofobjects].friction=friction;
- count=0;
- vec[0]=-sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=-sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=-sizex*0.25f;
- vec[1]=sizey*0.65f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.25f;
- vec[1]=sizey*0.65f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(3,vec,NULL,mass*0.25f,-1,10000);
- for (count=0;count<object[numofobjects].numofparticles;count++)
- for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],6,numofobjects);
- object[numofobjects].numofcdlines=6;
- count=0;
- object[numofobjects].cdline[count][0]=4;
- object[numofobjects].cdline[count][1]=5;
- count=1;
- object[numofobjects].cdline[count][0]=5;
- object[numofobjects].cdline[count][1]=1;
- count=2;
- object[numofobjects].cdline[count][0]=1;
- object[numofobjects].cdline[count][1]=2;
- count=3;
- object[numofobjects].cdline[count][0]=2;
- object[numofobjects].cdline[count][1]=3;
- count=4;
- object[numofobjects].cdline[count][0]=3;
- object[numofobjects].cdline[count][1]=0;
- count=5;
- object[numofobjects].cdline[count][0]=0;
- object[numofobjects].cdline[count][1]=4;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createhead(float position[3],float sizex,float sizey,float mass,float friction)
- {
- int count;
- float vec[3];
- float angle;
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=5;
- object[numofobjects].timetolive=10000;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.25f;
- else
- object[numofobjects].radius=sizey*1.25f;
- object[numofobjects].mass=mass;
- object[numofobjects].texturenum=animation[19].stand[0];
- object[numofobjects].friction=friction;
- object[numofobjects].numofparticles=8;
- for (count=0;count<8;count++)
- {
- angle=(float)count*pi/4.0f;
- vec[0]=position[0]+cos(angle)*sizex*0.5f;
- vec[1]=position[1]-sin(angle)*sizey*0.5f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,mass/8.0f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- }
- for (count=0;count<8;count++)
- {
- createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects);
- createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects);
- createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects);
- }
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=8;
- for (count=0;count<8;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&7);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createamber(float position[3])
- {
- int count;
- float vec[3];
- float angle;
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=6;
- object[numofobjects].timetolive=10000;
- object[numofobjects].radius=1.0f;
- object[numofobjects].texturenum=369;
- object[numofobjects].friction=0.3f;
- object[numofobjects].numofparticles=8;
- for (count=0;count<8;count++)
- {
- angle=(float)count*pi/4.0f;
- vec[0]=position[0]+cos(angle)*0.35f;
- vec[1]=position[1]-sin(angle)*0.35f;
- vec[2]=0.0f;
- createparticle(3,vec,NULL,0.125f,numofobjects,10000);
- object[numofobjects].particle[count]=numofparticles-1;
- }
- for (count=0;count<8;count++)
- {
- createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects);
- createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects);
- createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects);
- }
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=8;
- for (count=0;count<8;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&7);
- }
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void createareaswitch(float position[3],float sizex,float sizey)
- {
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=16;
- object[numofobjects].timetolive=10000;
- copyvector(object[numofobjects].position,position);
- object[numofobjects].size[0]=sizex;
- object[numofobjects].size[1]=sizey;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void creategenerator(float position[3],float mass)
- {
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=15;
- object[numofobjects].timetolive=10000;
- object[numofobjects].mass=mass;
- copyvector(object[numofobjects].position,position);
- object[numofobjects].radius=2.0f;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
- void deleteobject(int objectnum)
- {
- int count;
- if (objectnum<0)
- return;
- if (objectnum>=numofobjects)
- return;
- for (count=0;count<object[objectnum].numofparticles;count++)
- {
- particle[object[objectnum].particle[count]].timetolive=1;
- particle[object[objectnum].particle[count]].objectnum=-1;
- }
- for (count=0;count<numofobjects;count++)
- if (object[count].link==objectnum)
- object[count].link=-1;
- for (count=0;count<numofropes;count++)
- if (rope[count].link==objectnum)
- rope[count].link=-1;
- for (count=0;count<numofbonds;count++)
- if (bond[count].type!=4 && bond[count].type!=7)
- if (bond[count].objectnum==objectnum)
- bond[count].objectnum=-1;
- deletesound(object[objectnum].soundnum[0]);
- deletesound(object[objectnum].soundnum[1]);
- deletesound(object[objectnum].soundnum[2]);
- deletesound(object[objectnum].soundnum[3]);
- numofobjects--;
- if (objectnum==numofobjects)
- return;
- memcpy(&object[objectnum],&object[numofobjects],sizeof(object[objectnum]));
- for (count=0;count<object[objectnum].numofparticles;count++)
- if (particle[object[objectnum].particle[count]].objectnum!=-1)
- particle[object[objectnum].particle[count]].objectnum=objectnum;
- for (count=0;count<numofobjects;count++)
- if (object[count].link==numofobjects)
- object[count].link=objectnum;
- for (count=0;count<numofropes;count++)
- if (rope[count].link==numofobjects)
- rope[count].link=objectnum;
- for (count=0;count<numofbonds;count++)
- if (bond[count].type!=4 && bond[count].type!=7)
- if (bond[count].objectnum==numofobjects)
- bond[count].objectnum=objectnum;
- for (count=0;count<numofsounds;count++)
- if (sound[count].objectnum==numofobjects)
- sound[count].objectnum=objectnum;
- }
- void deleterope(int ropenum)
- {
- int count;
- if (ropenum<0)
- return;
- if (ropenum>=numofropes)
- return;
- if (rope[ropenum].type==1)
- playsound(3,particle[rope[ropenum].part1].position,NULL,1.0f,0,1.0f,-1,0);
- if (rope[ropenum].type==2)
- playsound(3,particle[rope[ropenum].part1].position,NULL,1.0f,0,0.75f,-1,0);
- if (rope[ropenum].type==3)
- playsound(4,particle[rope[ropenum].part1].position,NULL,1.0f,0,1.0f,-1,0);
- if (rope[ropenum].type==4)
- playsound(4,particle[rope[ropenum].part1].position,NULL,1.0f,0,0.75f,-1,0);
- numofropes--;
- if (ropenum==numofropes)
- return;
- memcpy(&rope[ropenum],&rope[numofropes],sizeof(rope[0]));
- for (count=0;count<numofbonds;count++)
- if (bond[count].type==4 || bond[count].type==7)
- if (bond[count].objectnum==numofropes)
- bond[count].objectnum=ropenum;
- }
- void objecttimetolive(void)
- {
- int count;
- count=0;
- while (count<numofobjects)
- {
- if (object[count].timetolive<10000)
- object[count].timetolive--;
- while (count<numofobjects && object[count].timetolive<0)
- {
- deleteobject(count);
- if (object[count].timetolive<10000)
- object[count].timetolive--;
- }
- count++;
- }
- }
- void createcar(float position[3],float sizex,float sizey,float mass,float friction)
- {
- int count,count2;
- float vec[3];
- memset(&object[numofobjects],0,sizeof(object[numofobjects]));
- object[numofobjects].type=20;
- object[numofobjects].timetolive=10000;
- object[numofobjects].mass=mass;
- object[numofobjects].numofparticles=4;
- if (sizex>=sizey)
- object[numofobjects].radius=sizex*1.5f;
- else
- object[numofobjects].radius=sizey*1.5f;
- object[numofobjects].size[0]=sizex;
- object[numofobjects].size[1]=sizey;
- object[numofobjects].friction=friction;
- count=0;
- vec[0]=-sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(6,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(6,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(6,vec,NULL,mass*0.25f,-1,10000);
- vec[0]=-sizex*0.5f;
- vec[1]=-sizey*0.5f;
- vec[2]=0.0f;
- addvectors(vec,vec,position);
- object[numofobjects].particle[count]=numofparticles;
- count++;
- createparticle(6,vec,NULL,mass*0.25f,-1,10000);
- for (count=0;count<object[numofobjects].numofparticles;count++)
- for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
- createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],9,-1);
- copyvector(object[numofobjects].position,position);
- object[numofobjects].numofcdlines=4;
- for (count=0;count<4;count++)
- {
- object[numofobjects].cdline[count][0]=count;
- object[numofobjects].cdline[count][1]=((count+1)&3);
- }
- object[numofobjects].texcoord[0][0]=0.0f;
- object[numofobjects].texcoord[0][1]=0.0f;
- object[numofobjects].texcoord[1][0]=1.0f;
- object[numofobjects].texcoord[1][1]=0.0f;
- object[numofobjects].texcoord[2][0]=1.0f;
- object[numofobjects].texcoord[2][1]=1.0f;
- object[numofobjects].texcoord[3][0]=0.0f;
- object[numofobjects].texcoord[3][1]=1.0f;
- object[numofobjects].soundnum[0]=-1;
- object[numofobjects].soundnum[1]=-1;
- object[numofobjects].soundnum[2]=-1;
- object[numofobjects].soundnum[3]=-1;
- numofobjects++;
- }
|