123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551 |
- #ifdef PRECOMPILEDHEADERS
- #include "TileEngine All.h"
- #else
- #include "math.h"
- #include <stdio.h>
- #include <errno.h>
-
- #include "worlddef.h"
- #include "renderworld.h"
- #include "vsurface.h"
- #include "input.h"
- #include "sysutil.h"
- #include "wchar.h"
- #include "video.h"
- #include "vobject_blitters.h"
- #include "debug.h"
- #include "wcheck.h"
- #include "worldman.h"
- #include "jascreens.h"
- #include "edit_sys.h"
- #include "Isometric Utils.h"
- #include "line.h"
- #include "Animation Control.h"
- #include "Animation Data.h"
- #include "Timer Control.h"
- #include "Radar Screen.h"
- #include "Render Dirty.h"
- #include "Font Control.h"
- #include "Sys Globals.h"
- #include "Render Dirty.h"
- #include "lighting.h"
- #include "Overhead types.h"
- #include "Overhead.h"
- #include "weapons.h"
- #include "ai.h"
- #include "vobject.h"
- #include "render fun.h"
- #include "los.h"
- #include "interactive tiles.h"
- #include "interface cursors.h"
- #include "rotting corpses.h"
- #include "tile cache.h"
- #include "tile animation.h"
- #include "English.h"
- #include "world items.h"
- #include "GameSettings.h"
- #include "interface control.h"
- #endif
- ///////////////////////////
- // C file include here
- #include "Render Z.c"
- ///////////////////////////
- extern INT8 gDebugStr[128];
- extern BOOLEAN fLandLayerDirty = TRUE;
- extern INT16 gsVIEWPORT_START_X;
- extern INT16 gsVIEWPORT_START_Y;
- extern INT16 gsVIEWPORT_END_Y;
- extern INT16 gsVIEWPORT_WINDOW_END_Y;
- extern INT16 gsVIEWPORT_WINDOW_START_Y;
- extern INT16 gsVIEWPORT_END_X;
- UINT16 *gpZBuffer=NULL;
- BOOLEAN gfTagAnimatedTiles=TRUE;
- INT16 gsCurrentGlowFrame = 0;
- INT16 gsCurrentItemGlowFrame = 0;
- extern BOOLEAN gfUIShowExitEast;
- extern BOOLEAN gfUIShowExitWest;
- extern BOOLEAN gfUIShowExitNorth;
- extern BOOLEAN gfUIShowExitSouth;
- extern BOOLEAN gfTopMessageDirty;
- // VIEWPORT OFFSET VALUES
- // NOTE:
- // THESE VALUES MUST BE MULTIPLES OF TILE SIZES!
- #define VIEWPORT_XOFFSET_S WORLD_TILE_X*1
- #define VIEWPORT_YOFFSET_S WORLD_TILE_Y*2
- #define LARGER_VIEWPORT_XOFFSET_S ( VIEWPORT_XOFFSET_S * 3 )
- #define LARGER_VIEWPORT_YOFFSET_S ( VIEWPORT_YOFFSET_S * 5 )
- #define TILES_TYPE_BITMASK 0x00040000
- #define TILES_TYPE_MASK 0x07ffffff
- #define TILES_DIRTY 0x80000000
- #define TILES_DYNAMIC 0x40000000
- #define TILES_NOZWRITE 0x20000000
- #define TILES_MARKED 0x10000000
- #define TILES_NOZ 0x04000000
- #define TILES_DOALL 0x02000000
- #define TILES_OBSCURED 0x01000000
- //#define TILES_MERC 0x00000400
- //#define TILES_Z_BLITTER 0x00000200
- //#define TILES_Z_WRITE 0x00000100
- //#define TILES_SHADOW 0x00000080
- //#define TILES_BACKWARDS 0x00000040
- #define MAX_RENDERED_ITEMS 3
- // RENDERER FLAGS FOR DIFFERENT RENDER LEVELS
- typedef enum
- {
- RENDER_STATIC_LAND,
- RENDER_STATIC_OBJECTS,
- RENDER_STATIC_SHADOWS,
- RENDER_STATIC_STRUCTS,
- RENDER_STATIC_ROOF,
- RENDER_STATIC_ONROOF,
- RENDER_STATIC_TOPMOST,
- RENDER_DYNAMIC_LAND,
- RENDER_DYNAMIC_OBJECTS,
- RENDER_DYNAMIC_SHADOWS,
- RENDER_DYNAMIC_STRUCT_MERCS,
- RENDER_DYNAMIC_MERCS,
- RENDER_DYNAMIC_STRUCTS,
- RENDER_DYNAMIC_ROOF,
- RENDER_DYNAMIC_HIGHMERCS,
- RENDER_DYNAMIC_ONROOF,
- RENDER_DYNAMIC_TOPMOST,
- NUM_RENDER_FX_TYPES
- };
- #define SCROLL_INTERTIA_STEP1 6
- #define SCROLL_INTERTIA_STEP2 8
- //#define SHORT_ROUND( x ) ( (INT16)( ( x * 1000 ) / 1000 ) )
- #define SHORT_ROUND( x ) ( x )
- #define NUM_ITEM_CYCLE_COLORS 60
- UINT16 us16BPPItemCycleWhiteColors[ NUM_ITEM_CYCLE_COLORS ];
- UINT16 us16BPPItemCycleRedColors[ NUM_ITEM_CYCLE_COLORS ];
- UINT16 us16BPPItemCycleYellowColors[ NUM_ITEM_CYCLE_COLORS ];
- INT16 gsLobOutline;
- INT16 gsThrowOutline;
- INT16 gsGiveOutline;
- INT16 gusNormalItemOutlineColor;
- INT16 gusYellowItemOutlineColor;
- INT16 gsRenderHeight = 0;
- BOOLEAN gfRenderFullThisFrame = 0;
- //UINT8 gubIntTileCheckFlags = INTILE_CHECK_FULL;
- UINT8 gubIntTileCheckFlags = INTILE_CHECK_SELECTIVE;
- UINT8 ubRGBItemCycleWhiteColors[] =
- {
- 25, 25, 25,
- 50, 50, 50,
- 75, 75, 75,
- 100, 100, 100,
- 125, 125, 125,
- 150, 150, 150,
- 175, 175, 175,
- 200, 200, 200,
- 225, 225, 225,
- 250, 250, 250,
- 250, 250, 250,
- 225, 225, 225,
- 200, 200, 200,
- 175, 175, 175,
- 150, 150, 150,
- 125, 125, 125,
- 100, 100, 100,
- 75, 75, 75,
- 50, 50, 50,
- 25, 25, 25,
- 25, 25, 25,
- 50, 50, 50,
- 75, 75, 75,
- 100, 100, 100,
- 125, 125, 125,
- 150, 150, 150,
- 175, 175, 175,
- 200, 200, 200,
- 225, 225, 225,
- 250, 250, 250,
- 250, 250, 250,
- 225, 225, 225,
- 200, 200, 200,
- 175, 175, 175,
- 150, 150, 150,
- 125, 125, 125,
- 100, 100, 100,
- 75, 75, 75,
- 50, 50, 50,
- 25, 25, 25,
- 25, 25, 25,
- 50, 50, 50,
- 75, 75, 75,
- 100, 100, 100,
- 125, 125, 125,
- 150, 150, 150,
- 175, 175, 175,
- 200, 200, 200,
- 225, 225, 225,
- 250, 250, 250,
- 250, 250, 250,
- 225, 225, 225,
- 200, 200, 200,
- 175, 175, 175,
- 150, 150, 150,
- 125, 125, 125,
- 100, 100, 100,
- 75, 75, 75,
- 50, 50, 50,
- 25, 25, 25
- };
- UINT8 ubRGBItemCycleRedColors[] =
- {
- 25, 0, 0,
- 50, 0, 0,
- 75, 0, 0,
- 100, 0, 0,
- 125, 0, 0,
- 150, 0, 0,
- 175, 0, 0,
- 200, 0, 0,
- 225, 0, 0,
- 250, 0, 0,
- 250, 0, 0,
- 225, 0, 0,
- 200, 0, 0,
- 175, 0, 0,
- 150, 0, 0,
- 125, 0, 0,
- 100, 0, 0,
- 75, 0, 0,
- 50, 0, 0,
- 25, 0, 0,
- 25, 0, 0,
- 50, 0, 0,
- 75, 0, 0,
- 100, 0, 0,
- 125, 0, 0,
- 150, 0, 0,
- 175, 0, 0,
- 200, 0, 0,
- 225, 0, 0,
- 250, 0, 0,
- 250, 0, 0,
- 225, 0, 0,
- 200, 0, 0,
- 175, 0, 0,
- 150, 0, 0,
- 125, 0, 0,
- 100, 0, 0,
- 75, 0, 0,
- 50, 0, 0,
- 25, 0, 0,
- 25, 0, 0,
- 50, 0, 0,
- 75, 0, 0,
- 100, 0, 0,
- 125, 0, 0,
- 150, 0, 0,
- 175, 0, 0,
- 200, 0, 0,
- 225, 0, 0,
- 250, 0, 0,
- 250, 0, 0,
- 225, 0, 0,
- 200, 0, 0,
- 175, 0, 0,
- 150, 0, 0,
- 125, 0, 0,
- 100, 0, 0,
- 75, 0, 0,
- 50, 0, 0,
- 25, 0, 0,
- };
- UINT8 ubRGBItemCycleYellowColors[] =
- {
- 25, 25, 0,
- 50, 50, 0,
- 75, 75, 0,
- 100, 100, 0,
- 125, 125, 0,
- 150, 150, 0,
- 175, 175, 0,
- 200, 200, 0,
- 225, 225, 0,
- 250, 250, 0,
- 250, 250, 0,
- 225, 225, 0,
- 200, 200, 0,
- 175, 175, 0,
- 150, 150, 0,
- 125, 125, 0,
- 100, 100, 0,
- 75, 75, 0,
- 50, 50, 0,
- 25, 25, 0,
- 25, 25, 0,
- 50, 50, 0,
- 75, 75, 0,
- 100, 100, 0,
- 125, 125, 0,
- 150, 150, 0,
- 175, 175, 0,
- 200, 200, 0,
- 225, 225, 0,
- 250, 250, 0,
- 250, 250, 0,
- 225, 225, 0,
- 200, 200, 0,
- 175, 175, 0,
- 150, 150, 0,
- 125, 125, 0,
- 100, 100, 0,
- 75, 75, 0,
- 50, 50, 0,
- 25, 25, 0,
- 25, 25, 0,
- 50, 50, 0,
- 75, 75, 0,
- 100, 100, 0,
- 125, 125, 0,
- 150, 150, 0,
- 175, 175, 0,
- 200, 200, 0,
- 225, 225, 0,
- 250, 250, 0,
- 250, 250, 0,
- 225, 225, 0,
- 200, 200, 0,
- 175, 175, 0,
- 150, 150, 0,
- 125, 125, 0,
- 100, 100, 0,
- 75, 75, 0,
- 50, 50, 0,
- 25, 25, 0,
- };
- #define NUMSPEEDS 5
- UINT8 gubNewScrollXSpeeds[2][ NUMSPEEDS ] =
- {
- 40, 80, 100, 180, 200, // Non-video mode scroll
- 20, 40, 80, 80, 80 // Video mode scroll
- };
- UINT8 gubNewScrollYSpeeds[2][ NUMSPEEDS ] =
- {
- 40, 80, 100, 180, 200, // Non-video mode scroll
- 10, 20, 60, 80, 80 // Video mode scroll
- };
- // These speeds are only an indication of how long to do each subtile step until moving on to another
- UINT8 gubNewScrollIDSpeeds[ ] = { 10, 10, 20, 20, 20 };
- UINT8 gubScrollSpeedStartID = 2;
- UINT8 gubScrollSpeedEndID = 4;
- UINT8 gubCurScrollSpeedID = 1;
- BOOLEAN gfDoVideoScroll = TRUE;
- BOOLEAN gfDoSubtileScroll = FALSE;
- BOOLEAN gfScrollPending = FALSE;
- UINT32 uiLayerUsedFlags=0xffffffff;
- UINT32 uiAdditiveLayerUsedFlags=0xffffffff;
- // Array of shade values to use.....
- #define NUM_GLOW_FRAMES 30
- #if 0
- INT16 gsGlowFrames[] =
- {
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 9,
- 8,
- 7,
- 6,
- 5,
- 4,
- 3,
- 2,
- 1,
- 0,
- };
- #endif
- INT16 gsGlowFrames[] =
- {
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 2,
- 4,
- 6,
- 8,
- 9,
- 8,
- 6,
- 4,
- 2,
- 0,
- };
- // This has to be the same # of frames as NUM_GLOW_FRAMES
- INT16 gsFastGlowFrames[] =
- {
- 0,
- 0,
- 6,
- 7,
- 8,
- 9,
- 8,
- 7,
- 6,
- 5,
- 0,
- 0,
- 6,
- 7,
- 8,
- 9,
- 8,
- 7,
- 6,
- 5,
- 0,
- 0,
- 6,
- 7,
- 8,
- 9,
- 8,
- 7,
- 6,
- 5,
- };
- // The glow frame pointer can be adjusted to use a faster/ slower glow
- INT16 *gpGlowFramePointer = gsGlowFrames;
- UINT32 gScrollDirectionFlags[ NUM_WORLD_DIRECTIONS ] =
- {
- SCROLL_UP | SCROLL_RIGHT,
- SCROLL_RIGHT,
- SCROLL_DOWN | SCROLL_RIGHT,
- SCROLL_DOWN,
- SCROLL_DOWN | SCROLL_LEFT,
- SCROLL_LEFT,
- SCROLL_UP | SCROLL_LEFT,
- SCROLL_UP,
- };
- INT16 SCROLL_X_STEP = ( WORLD_TILE_X );
- INT16 SCROLL_Y_STEP = ( WORLD_TILE_Y * 2);
- INT16 gsVIEWPORT_START_X = 0;
- INT16 gsVIEWPORT_START_Y = 0;
- INT16 gsVIEWPORT_END_Y = 360;
- INT16 gsVIEWPORT_WINDOW_END_Y = 360;
- INT16 gsVIEWPORT_WINDOW_START_Y = 0;
- INT16 gsVIEWPORT_END_X = 640;
- INT16 gsTopLeftWorldX, gsTopLeftWorldY;
- INT16 gsTopRightWorldX, gsTopRightWorldY;
- INT16 gsBottomLeftWorldX, gsBottomLeftWorldY;
- INT16 gsBottomRightWorldX, gsBottomRightWorldY;
- BOOLEAN gfIgnoreScrolling = FALSE;
- BOOLEAN gfIgnoreScrollDueToCenterAdjust = FALSE;
- // GLOBAL SCROLLING PARAMS
- INT16 gTopLeftWorldLimitX, gTopLeftWorldLimitY;
- INT16 gTopRightWorldLimitX, gTopRightWorldLimitY;
- INT16 gBottomLeftWorldLimitX, gBottomLeftWorldLimitY;
- INT16 gBottomRightWorldLimitX, gBottomRightWorldLimitY;
- INT16 Slide, gCenterWorldY;
- INT16 gsTLX, gsTLY, gsTRX, gsTRY;
- INT16 gsBLX, gsBLY, gsBRX, gsBRY;
- INT16 gsCX, gsCY;
- DOUBLE gdScaleX, gdScaleY;
- #define FASTMAPROWCOLTOPOS( r, c ) ( (r) * WORLD_COLS + (c) )
- BOOLEAN gfScrollInertia = FALSE;
- // GLOBALS FOR CALCULATING STARTING PARAMETERS
- INT16 gsStartPointX_W, gsStartPointY_W;
- INT16 gsStartPointX_S, gsStartPointY_S;
- INT16 gsStartPointX_M, gsStartPointY_M;
- INT16 gsEndXS, gsEndYS;
- // LARGER OFFSET VERSION FOR GIVEN LAYERS
- INT16 gsLStartPointX_W, gsLStartPointY_W;
- INT16 gsLStartPointX_S, gsLStartPointY_S;
- INT16 gsLStartPointX_M, gsLStartPointY_M;
- INT16 gsLEndXS, gsLEndYS;
- BOOLEAN gfRenderScroll = FALSE;
- BOOLEAN gfScrollStart = FALSE;
- INT16 gsScrollXIncrement;
- INT16 gsScrollYIncrement;
- INT32 guiScrollDirection;
- // Rendering flags (full, partial, etc.)
- UINT32 gRenderFlags=0;
- SGPRect gClippingRect = { 0, 0, 640, 360};
- SGPRect gOldClipRect;
- INT16 gsRenderCenterX;
- INT16 gsRenderCenterY;
- INT16 gsRenderWorldOffsetX = -1;
- INT16 gsRenderWorldOffsetY = -1;
- SGPRect gSelectRegion;
- UINT32 fSelectMode = NO_SELECT;
- SGPPoint gSelectAnchor;
- typedef struct
- {
- BOOLEAN fDynamic;
- BOOLEAN fZWrite;
- BOOLEAN fZBlitter;
- BOOLEAN fShadowBlitter;
- BOOLEAN fLinkedListDirection;
- BOOLEAN fMerc;
- BOOLEAN fCheckForRedundency;
- BOOLEAN fMultiZBlitter;
- BOOLEAN fConvertTo16;
- BOOLEAN fObscured;
- } RenderFXType;
- RenderFXType RenderFX[] =
- {
- FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, // STATIC LAND
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, // STATIC OBJECTS
- FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC SHADOWS
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, // STATIC STRUCTS
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC ROOF
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, // STATIC ONROOF
- FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC TOPMOST
- TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, // DYNAMIC LAND
- TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, // DYNAMIC OBJECT
- TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC SHADOW
- TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC STRUCT MERCS
- TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC MERCS
- TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC STRUCT
- TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC ROOF
- TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC HIGHMERCS
- TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC ONROOF
- TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE // DYNAMIC TOPMOST
- };
- UINT8 RenderFXStartIndex[] =
- {
- LAND_START_INDEX, // STATIC LAND
- OBJECT_START_INDEX, // STATIC OBJECTS
- SHADOW_START_INDEX, // STATIC SHADOWS
- STRUCT_START_INDEX, // STATIC STRUCTS
- ROOF_START_INDEX, // STATIC ROOF
- ONROOF_START_INDEX, // STATIC ONROOF
- TOPMOST_START_INDEX, // STATIC TOPMOST
- LAND_START_INDEX, // DYNAMIC LAND
- OBJECT_START_INDEX, // DYNAMIC OBJECT
- SHADOW_START_INDEX, // DYNAMIC SHADOW
- MERC_START_INDEX, // DYNAMIC STRUCT MERCS
- MERC_START_INDEX, // DYNAMIC MERCS
- STRUCT_START_INDEX, // DYNAMIC STRUCT
- ROOF_START_INDEX, // DYNAMIC ROOF
- MERC_START_INDEX, // DYNAMIC HIGHMERCS
- ONROOF_START_INDEX, // DYNAMIC ONROOF
- TOPMOST_START_INDEX, // DYNAMIC TOPMOST
- };
- //INT16 gsCoordArray[ 500 ][ 500 ][ 4 ];
- //INT16 gsCoordArrayX;
- //INT16 gsCoordArrayY;
- //void SetRenderGlobals( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- //void TempRenderTiles(UINT32 uiFlags, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- //void TempRenderTiles(UINT32 uiFlags, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS, UINT8 ubNumLevels, UINT32 *puiLevels );
- void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- //void ReRenderWorld(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom);
- void ClearMarkedTiles(void);
- void CorrectRenderCenter( INT16 sRenderX, INT16 sRenderY, INT16 *pSNewX, INT16 *pSNewY );
- void ScrollBackground(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScrollYIncrement );
- void CalcRenderParameters(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom );
- void ResetRenderParameters( );
- BOOLEAN Zero8BPPDataTo16BPPBufferTransparent( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex );
- BOOLEAN Blt8BPPDataTo16BPPBufferTransInvZ( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex );
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette );
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion);
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette );
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion);
- void RenderRoomInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- #ifdef _DEBUG
- extern UINT8 gubFOVDebugInfoInfo[ WORLD_MAX ];
- extern UINT8 gubGridNoMarkers[ WORLD_MAX ];
- extern UINT8 gubGridNoValue;
- extern BOOLEAN gfDisplayCoverValues;
- extern BOOLEAN gfDisplayGridNoVisibleValues = 0;
- extern INT16 gsCoverValue[ WORLD_MAX ];
- extern INT16 gsBestCover;
- void RenderFOVDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- void RenderCoverDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- void RenderGridNoVisibleDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- #endif
- void DeleteFromWorld( UINT16 usTileIndex, UINT32 uiRenderTiles, UINT16 usIndex );
- void RenderHighlight( INT16 sMouseX_M, INT16 sMouseY_M, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
- BOOLEAN CheckRenderCenter( INT16 sNewCenterX, INT16 sNewCenterY );
- BOOLEAN RevealWalls(INT16 sX, INT16 sY, INT16 sRadius)
- {
- LEVELNODE *pStruct;
- INT16 sCountX, sCountY;
- UINT32 uiTile;
- BOOLEAN fRerender=FALSE;
- TILE_ELEMENT *TileElem;
- for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
- for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
- {
- uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
- pStruct=gpWorldLevelData[uiTile].pStructHead;
- while(pStruct!=NULL)
- {
- TileElem = &(gTileDatabase[pStruct->usIndex]);
- switch(TileElem->usWallOrientation)
- {
- case NO_ORIENTATION:
- break;
- case INSIDE_TOP_RIGHT:
- case OUTSIDE_TOP_RIGHT:
- if(sCountX >= sX)
- {
- pStruct->uiFlags|=LEVELNODE_REVEAL;
- fRerender=TRUE;
- }
- break;
- case INSIDE_TOP_LEFT:
- case OUTSIDE_TOP_LEFT:
- if(sCountY >= sY)
- {
- pStruct->uiFlags|=LEVELNODE_REVEAL;
- fRerender=TRUE;
- }
- break;
- }
- pStruct=pStruct->pNext;
- }
- }
- /*
- if(fRerender)
- SetRenderFlags(RENDER_FLAG_FULL);
- */
- return(TRUE);
- }
- BOOLEAN ConcealWalls(INT16 sX, INT16 sY, INT16 sRadius)
- {
- LEVELNODE *pStruct;
- INT16 sCountX, sCountY;
- UINT32 uiTile;
- BOOLEAN fRerender=FALSE;
- TILE_ELEMENT *TileElem;
- for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
- for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
- {
- uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
- pStruct=gpWorldLevelData[uiTile].pStructHead;
- while(pStruct!=NULL)
- {
- TileElem = &(gTileDatabase[pStruct->usIndex]);
- switch(TileElem->usWallOrientation)
- {
- case NO_ORIENTATION:
- break;
- case INSIDE_TOP_RIGHT:
- case OUTSIDE_TOP_RIGHT:
- if(sCountX >= sX)
- {
- pStruct->uiFlags&=(~LEVELNODE_REVEAL);
- fRerender=TRUE;
- }
- break;
- case INSIDE_TOP_LEFT:
- case OUTSIDE_TOP_LEFT:
- if(sCountY >= sY)
- {
- pStruct->uiFlags&=(~LEVELNODE_REVEAL);
- fRerender=TRUE;
- }
- break;
- }
- pStruct=pStruct->pNext;
- }
- }
- /*
- if(fRerender)
- SetRenderFlags(RENDER_FLAG_FULL);
- */
- return(TRUE);
- }
- void ConcealAllWalls(void)
- {
- LEVELNODE *pStruct;
- UINT32 uiCount;
- for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
- {
- pStruct=gpWorldLevelData[uiCount].pStructHead;
- while(pStruct!=NULL)
- {
- pStruct->uiFlags&=(~LEVELNODE_REVEAL);
- pStruct=pStruct->pNext;
- }
- }
- }
- void ResetLayerOptimizing(void)
- {
- uiLayerUsedFlags = 0xffffffff;
- uiAdditiveLayerUsedFlags = 0;
- }
- void ResetSpecificLayerOptimizing( UINT32 uiRowFlag )
- {
- uiLayerUsedFlags |= uiRowFlag;
- }
- void SumAddiviveLayerOptimization( void )
- {
- uiLayerUsedFlags = uiAdditiveLayerUsedFlags;
- }
- void SetRenderFlags(UINT32 uiFlags)
- {
- gRenderFlags|=uiFlags;
- }
- void ClearRenderFlags(UINT32 uiFlags)
- {
- gRenderFlags&=(~uiFlags);
- }
- UINT32 GetRenderFlags(void)
- {
- return(gRenderFlags);
- }
- void RenderSetShadows(BOOLEAN fShadows)
- {
- if(fShadows)
- gRenderFlags|=RENDER_FLAG_SHADOWS;
- else
- gRenderFlags&=(~RENDER_FLAG_SHADOWS);
- }
- void RenderTiles(UINT32 uiFlags, INT32 iStartPointX_M, INT32 iStartPointY_M, INT32 iStartPointX_S, INT32 iStartPointY_S, INT32 iEndXS, INT32 iEndYS, UINT8 ubNumLevels, UINT32 *puiLevels, UINT16 *psLevelIDs )
- {
- //#if 0
- LEVELNODE *pNode; //, *pLand, *pStruct; //*pObject, *pTopmost, *pMerc;
- SOLDIERTYPE *pSoldier, *pSelSoldier;
- HVOBJECT hVObject;
- ETRLEObject *pTrav;
- TILE_ELEMENT *TileElem=NULL;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf=NULL;
- UINT16 usAnimSurface;
- INT8 bXOddFlag = 0;
- INT32 iAnchorPosX_M, iAnchorPosY_M;
- INT32 iAnchorPosX_S, iAnchorPosY_S;
- INT32 iTempPosX_M, iTempPosY_M;
- INT32 iTempPosX_S, iTempPosY_S;
- FLOAT dOffsetX, dOffsetY;
- FLOAT dTempX_S, dTempY_S;
- UINT32 uiTileIndex;
- UINT16 usImageIndex, *pShadeTable, *pDirtyBackPtr;
- UINT32 uiBrushWidth, uiBrushHeight, uiDirtyFlags;
- INT16 sTileHeight, sXPos, sYPos, sZLevel;
- INT16 sMouseX_M, sMouseY_M;
- BOOLEAN fShadowBlitter=FALSE;
- BOOLEAN fZBlitter=FALSE;
- BOOLEAN fZWrite=FALSE;
- BOOLEAN fLinkedListDirection=TRUE;
- BOOLEAN fRenderTile=TRUE;
- BOOLEAN fMerc=FALSE;
- BOOLEAN fCheckForRedundency=FALSE;
- UINT32 uiRowFlags;
- BOOLEAN fDynamic=TRUE;
- BOOLEAN fEndRenderRow = FALSE;
- BOOLEAN fEndRenderCol = FALSE;
- BOOLEAN fPixelate=FALSE;
- BOOLEAN fMultiZBlitter = FALSE;
- BOOLEAN fWallTile = FALSE;
- BOOLEAN fMultiTransShadowZBlitter = FALSE;
- INT16 sMultiTransShadowZBlitterIndex=-1;
- BOOLEAN fTranslucencyType=FALSE;
- INT16 sX, sY;
- BOOLEAN fTileInvisible = FALSE;
- BOOLEAN fConvertTo16=FALSE;
- BOOLEAN fBlit16=FALSE;
- UINT32 cnt;
- static UINT8 ubLevelNodeStartIndex[ NUM_RENDER_FX_TYPES ];
- BOOLEAN bItemOutline;
- UINT16 usOutlineColor=0;
- static INT32 iTileMapPos[ 500 ];
- UINT32 uiMapPosIndex;
- UINT8 bBlitClipVal;
- INT8 bItemCount, bVisibleItemCount;
- //UINT16 us16BPPIndex;
- RenderFXType RenderingFX;
- BOOLEAN fCheckForMouseDetections = FALSE;
- static RenderFXType RenderFXList[ NUM_RENDER_FX_TYPES ];
- BOOLEAN fSaveZ;
- INT16 sWorldY;
- INT16 sZOffsetX=-1;
- INT16 sZOffsetY=-1;
- BOOLEAN fIntensityBlitter;
- INT16 gsForceSoldierZLevel;
- ROTTING_CORPSE *pCorpse=NULL;
- BOOLEAN fUseTileElem;
- UINT32 uiLevelNodeFlags;
- UINT32 uiTileElemFlags=0;
- INT8 bGlowShadeOffset;
- BOOLEAN fObscured;
- BOOLEAN fObscuredBlitter;
- INT16 sModifiedTileHeight;
- BOOLEAN fDoRow;
- INT16 **pShadeStart;
- UINT32 uiSaveBufferPitchBYTES;
- UINT8 *pSaveBuf;
- ITEM_POOL *pItemPool = NULL;
- BOOLEAN fHiddenTile = FALSE;
- UINT32 uiAniTileFlags = 0;
- //Init some variables
- usImageIndex = 0;
- sZLevel = 0;
- uiDirtyFlags = 0;
- pShadeTable = NULL;
- // Begin Render Loop
- iAnchorPosX_M = iStartPointX_M;
- iAnchorPosY_M = iStartPointY_M;
- iAnchorPosX_S = iStartPointX_S;
- iAnchorPosY_S = iStartPointY_S;
- if(!(uiFlags&TILES_DIRTY))
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
- {
- if ( ShouldCheckForMouseDetections( ) )
- {
- BeginCurInteractiveTileCheck( gubIntTileCheckFlags );
- fCheckForMouseDetections = TRUE;
- // If we are in edit mode, don't do this...
- if ( gfEditMode )
- {
- fCheckForMouseDetections = FALSE;
- }
- }
- }
- //if((uiFlags&TILES_TYPE_MASK)==TILES_STATIC_LAND)
- GetMouseXY( &sMouseX_M, &sMouseY_M );
- pDirtyBackPtr=NULL;
- if(gTacticalStatus.uiFlags&TRANSLUCENCY_TYPE)
- fTranslucencyType=TRUE;
- for ( cnt = 0; cnt < ubNumLevels; cnt++ )
- {
- ubLevelNodeStartIndex[ cnt ] = RenderFXStartIndex[ psLevelIDs[ cnt ] ];
- RenderFXList[ cnt ] = RenderFX[ psLevelIDs[ cnt ] ];
- }
- do
- {
- iTempPosX_M = iAnchorPosX_M;
- iTempPosY_M = iAnchorPosY_M;
- iTempPosX_S = iAnchorPosX_S;
- iTempPosY_S = iAnchorPosY_S;
-
- uiMapPosIndex = 0;
- // Build tile index list
- do
- {
- iTileMapPos[ uiMapPosIndex ] = FASTMAPROWCOLTOPOS( iTempPosY_M, iTempPosX_M );
- iTempPosX_S += 40;
- iTempPosX_M ++;
- iTempPosY_M --;
-
- uiMapPosIndex++;
- } while( iTempPosX_S < iEndXS );
- for ( cnt = 0; cnt < ubNumLevels; cnt++ )
- {
- uiRowFlags = puiLevels[ cnt ];
- fDoRow = TRUE;
- if ( ( uiRowFlags & TILES_ALL_DYNAMICS ) && !( uiLayerUsedFlags & uiRowFlags ) && !( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE ) )
- {
- fDoRow = FALSE;
- }
- if ( fDoRow )
- {
- iTempPosX_M = iAnchorPosX_M;
- iTempPosY_M = iAnchorPosY_M;
- iTempPosX_S = iAnchorPosX_S;
- iTempPosY_S = iAnchorPosY_S;
-
- fEndRenderRow = FALSE;
- uiMapPosIndex = 0;
- if(bXOddFlag > 0)
- iTempPosX_S += 20;
- do
- {
- uiTileIndex = iTileMapPos[ uiMapPosIndex ];
- uiMapPosIndex++;
- //if ( 0 )
- if ( uiTileIndex < GRIDSIZE )
- {
- // OK, we're sreaching through this loop anyway, might as well check for mouse position
- // over objects...
- // Experimental!
- if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
- {
- if ( fCheckForMouseDetections && gpWorldLevelData[uiTileIndex].pStructHead != NULL )
- {
- LogMouseOverInteractiveTile( (INT16)uiTileIndex );
- }
- }
- if((uiFlags&TILES_MARKED) && !(gpWorldLevelData[uiTileIndex].uiFlags&MAPELEMENT_REDRAW))
- {
- pNode=NULL;
- }
- else
- {
- //pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ RenderFXStartIndex[ psLevelIDs[ cnt ] ] ];
- //pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ 0 ];
- //pNode=NULL;
- pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ ubLevelNodeStartIndex[ cnt ] ];
- }
- bItemCount = 0;
- bVisibleItemCount = 0;
- pItemPool = NULL;
- while(pNode!= NULL)
- {
- RenderingFX = RenderFXList[ cnt ];
- fObscured = RenderingFX.fObscured;
- fDynamic = RenderingFX.fDynamic;
-
- fMerc = RenderingFX.fMerc;
- fZWrite = RenderingFX.fZWrite;
- fZBlitter = RenderingFX.fZBlitter;
- fShadowBlitter = RenderingFX.fShadowBlitter;
- fLinkedListDirection = RenderingFX.fLinkedListDirection;
- fCheckForRedundency = RenderingFX.fCheckForRedundency;
- fMultiZBlitter = RenderingFX.fMultiZBlitter;
- fConvertTo16 = RenderingFX.fConvertTo16;
- fIntensityBlitter = FALSE;
- fSaveZ = FALSE;
- fWallTile = FALSE;
- gsForceSoldierZLevel = FALSE;
- pSoldier = NULL;
- fUseTileElem = FALSE;
- fMultiTransShadowZBlitter = FALSE;
- fObscuredBlitter = FALSE;
- fTranslucencyType = TRUE;
- uiAniTileFlags = 0;
- uiLevelNodeFlags = pNode->uiFlags;
-
- if ( fCheckForRedundency )
- {
- if ( ( gpWorldLevelData[ uiTileIndex ].uiFlags & MAPELEMENT_REDUNDENT) )
- {
- // IF WE DONOT WANT TO RE-EVALUATE FIRST
- if ( !( gpWorldLevelData[uiTileIndex].uiFlags & MAPELEMENT_REEVALUATE_REDUNDENCY ) && !(gTacticalStatus.uiFlags & NOHIDE_REDUNDENCY ) )
- {
- pNode = NULL;
- break;
- }
- }
- }
- // Force z-buffer blitting for marked tiles ( even ground!)
- if ( (uiFlags&TILES_MARKED) )
- {
- fZBlitter = TRUE;
- }
- //Looking up height every time here is alot better than doing it above!
- sTileHeight=gpWorldLevelData[uiTileIndex].sHeight;
- sModifiedTileHeight = ( ( ( sTileHeight / 80 ) - 1 ) * 80 );
- if ( sModifiedTileHeight < 0 )
- {
- sModifiedTileHeight = 0;
- }
- fRenderTile=TRUE;
- pDirtyBackPtr=NULL;
- if(uiLevelNodeFlags&LEVELNODE_REVEAL)
- {
- if(!fDynamic)
- fRenderTile=FALSE;
- else
- fPixelate=TRUE;
- }
- else
- fPixelate=FALSE;
- // non-type specific setup
- sXPos = (INT16)iTempPosX_S;
- sYPos = (INT16)iTempPosY_S;
- // setup for any tile type except mercs
- if(!fMerc )
- {
- if ( !( uiLevelNodeFlags & ( LEVELNODE_ROTTINGCORPSE | LEVELNODE_CACHEDANITILE ) ) )
- {
- if( ( uiLevelNodeFlags & LEVELNODE_REVEALTREES ) )
- {
- TileElem = &(gTileDatabase[pNode->usIndex + 2]);
- }
- else
- {
- TileElem = &(gTileDatabase[pNode->usIndex]);
- }
- // HANDLE INDEPENDANT-PER-TILE ANIMATIONS ( IE: DOORS, EXPLODING THINGS, ETC )
- if ( fDynamic )
- {
- if( ( uiLevelNodeFlags & LEVELNODE_ANIMATION ) )
- {
- if ( pNode->sCurrentFrame != -1 )
- {
- Assert( TileElem->pAnimData != NULL );
- TileElem = &gTileDatabase[TileElem->pAnimData->pusFrames[pNode->sCurrentFrame]];
- }
- }
- }
- }
- // Check for best translucency
- if ( uiLevelNodeFlags & LEVELNODE_USEBESTTRANSTYPE )
- {
- fTranslucencyType = FALSE;
- }
- if ( ( uiLevelNodeFlags & ( LEVELNODE_ROTTINGCORPSE | LEVELNODE_CACHEDANITILE ) ) )
- {
- if ( fDynamic )
- {
- if( !(uiLevelNodeFlags & ( LEVELNODE_DYNAMIC ) ) && !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC) )
- fRenderTile=FALSE;
- }
- else if( (uiLevelNodeFlags & ( LEVELNODE_DYNAMIC ) ) )
- fRenderTile=FALSE;
- }
- else
- {
- // Set Tile elem flags here!
- uiTileElemFlags = TileElem->uiFlags;
- // Set valid tile elem!
- fUseTileElem = TRUE;
- if(fDynamic || fPixelate)
- {
- if(!fPixelate)
- {
- if(!( uiTileElemFlags & ANIMATED_TILE) && !(uiTileElemFlags & DYNAMIC_TILE) && !(uiLevelNodeFlags & LEVELNODE_DYNAMIC) && !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC) )
- fRenderTile=FALSE;
- else if(!(uiTileElemFlags&DYNAMIC_TILE) && !(uiLevelNodeFlags&LEVELNODE_DYNAMIC) && !(uiLevelNodeFlags&LEVELNODE_LASTDYNAMIC) )
- // else if((TileElem->uiFlags&ANIMATED_TILE) )
- {
- Assert( TileElem->pAnimData != NULL );
- TileElem = &gTileDatabase[TileElem->pAnimData->pusFrames[TileElem->pAnimData->bCurrentFrame]];
- uiTileElemFlags = TileElem->uiFlags;
- }
- }
- }
- else if((uiTileElemFlags & ANIMATED_TILE) || (uiTileElemFlags & DYNAMIC_TILE) || (uiLevelNodeFlags & LEVELNODE_DYNAMIC) )
- {
- if ( !( uiFlags & TILES_OBSCURED ) || ( uiTileElemFlags & ANIMATED_TILE ) )
- {
- fRenderTile=FALSE;
- }
- }
- }
- // OK, ATE, CHECK FOR AN OBSCURED TILE AND MAKE SURE IF LEVELNODE IS SET
- // WE DON'T RENDER UNLESS WE HAVE THE RENDER FLAG SET!
- if ( fObscured )
- {
- if ( ( uiFlags & TILES_OBSCURED ) )
- {
- if ( uiLevelNodeFlags & LEVELNODE_SHOW_THROUGH )
- {
- fObscuredBlitter = TRUE;
- // ATE: Check if this is a levelnode, and what frame we are on
- // turn off......
- //if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && gsCurrentItemGlowFrame < 25 )
- //{
- // fRenderTile = FALSE;
- //}
- }
- else
- {
- // Don;t render if we are not on this render loop!
- fRenderTile = FALSE;
- }
- }
- else
- {
- if ( uiLevelNodeFlags & LEVELNODE_SHOW_THROUGH )
- {
- fRenderTile = FALSE;
- // ATE: Check if this is a levelnode, and what frame we are on
- // turn off......
- //if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && gsCurrentItemGlowFrame < 25 )
- //{
- // fRenderTile = TRUE;
- //}
- }
- }
- }
-
- // If flag says to do dynamic as well, render!
- if ( ( uiFlags & TILES_DOALL ) )
- {
- fRenderTile = TRUE;
- }
- // If we are on the struct layer, check for if it's hidden!
- if ( uiRowFlags & ( TILES_STATIC_STRUCTURES | TILES_DYNAMIC_STRUCTURES | TILES_STATIC_SHADOWS | TILES_DYNAMIC_SHADOWS ) )
- {
- if ( fUseTileElem )
- {
- #if 0
- // DONOT RENDER IF IT'S A HIDDEN STRUCT AND TILE IS NOT REVEALED
- if ( uiTileElemFlags & HIDDEN_TILE )
- {
- // IF WORLD IS NOT REVEALED, QUIT
- #ifdef JA2EDITOR
- if ( !gfEditMode )
- #endif
- {
- if ( !(gpWorldLevelData[ uiTileIndex ].uiFlags & MAPELEMENT_REVEALED ) && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
- {
- //CONTINUE, DONOT RENDER
- if(!fLinkedListDirection)
- pNode = pNode->pPrevNode;
- else
- pNode = pNode->pNext;
-
- continue;
- }
- }
- }
- #endif
- }
- }
- if(fRenderTile)
- {
- // Set flag to set layer as used
- if( fDynamic || fPixelate )
- {
- uiAdditiveLayerUsedFlags |= uiRowFlags;
- }
- if ( uiLevelNodeFlags & LEVELNODE_DYNAMICZ )
- {
- fSaveZ = TRUE;
- fZWrite = TRUE;
- }
- if ( ( uiLevelNodeFlags & LEVELNODE_CACHEDANITILE ) )
- {
- hVObject = gpTileCache[ pNode->pAniTile->sCachedTileID ].pImagery->vo;
- usImageIndex = pNode->pAniTile->sCurrentFrame;
- uiAniTileFlags = pNode->pAniTile->uiFlags;
- // Position corpse based on it's float position
- if ( ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE ) )
- {
- pCorpse = &( gRottingCorpse[ pNode->pAniTile->uiUserData ] );
- pShadeTable = pCorpse->pShades[ pNode->ubShadeLevel ];
- //pShadeTable = pCorpse->p16BPPPalette;
- dOffsetX = pCorpse->def.dXPos - gsRenderCenterX;
- dOffsetY = pCorpse->def.dYPos - gsRenderCenterY;
-
- // OK, if this is a corpse.... stop if not visible
- if ( pCorpse->def.bVisible != 1 && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
- {
- //CONTINUE, DONOT RENDER
- if(!fLinkedListDirection)
- pNode = pNode->pPrevNode;
- else
- pNode = pNode->pNext;
-
- continue;
- }
- }
- else
- {
- dOffsetX = (FLOAT)( pNode->pAniTile->sRelativeX - gsRenderCenterX );
- dOffsetY = (FLOAT)( pNode->pAniTile->sRelativeY - gsRenderCenterY );
- }
- // Calculate guy's position
- FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
- sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)dTempX_S;
- sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)dTempY_S - sTileHeight;
- // Adjust for offset position on screen
- sXPos -= gsRenderWorldOffsetX;
- sYPos -= gsRenderWorldOffsetY;
- }
- else
- {
- hVObject = TileElem->hTileSurface;
- usImageIndex=TileElem->usRegionIndex;
- // ADJUST FOR WORLD MAPELEM HIEGHT
- sYPos-=TileElem->sOffsetHeight;
-
- if((TileElem->uiFlags&IGNORE_WORLD_HEIGHT) )
- {
- sYPos = sYPos - sModifiedTileHeight;
- //sYPos -= sTileHeight;
- }
- if( !(uiLevelNodeFlags&LEVELNODE_IGNOREHEIGHT) && !(TileElem->uiFlags&IGNORE_WORLD_HEIGHT ))
- sYPos-=sTileHeight;
- if(!(uiFlags&TILES_DIRTY))
- {
- hVObject->pShadeCurrent=hVObject->pShades[pNode->ubShadeLevel];
- hVObject->pShade8=ubColorTables[pNode->ubShadeLevel];
- }
- }
-
- //ADJUST FOR RELATIVE OFFSETS
- if ( uiLevelNodeFlags & LEVELNODE_USERELPOS )
- {
- sXPos += pNode->sRelativeX;
- sYPos += pNode->sRelativeY;
- }
- if ( uiLevelNodeFlags& LEVELNODE_USEZ )
- {
- sYPos -= pNode->sRelativeZ;
- }
- //ADJUST FOR ABSOLUTE POSITIONING
- if ( uiLevelNodeFlags& LEVELNODE_USEABSOLUTEPOS )
- {
- dOffsetX = (FLOAT)(pNode->sRelativeX - gsRenderCenterX);
- dOffsetY = (FLOAT)(pNode->sRelativeY - gsRenderCenterY);
- // OK, DONT'T ASK... CONVERSION TO PROPER Y NEEDS THIS...
- dOffsetX -= CELL_Y_SIZE;
- FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
- sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)SHORT_ROUND( dTempX_S );
- sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)SHORT_ROUND( dTempY_S );
- // Adjust for offset position on screen
- sXPos -= gsRenderWorldOffsetX;
- sYPos -= gsRenderWorldOffsetY;
- sYPos -= pNode->sRelativeZ;
- }
- }
- // COUNT # OF ITEMS AT THIS LOCATION
- if ( uiLevelNodeFlags & LEVELNODE_ITEM )
- {
- // OK set item pool for this location....
- if ( bItemCount == 0 )
- {
- pItemPool = pNode->pItemPool;
- }
- else
- {
- pItemPool = pItemPool->pNext;
- }
- if ( bItemCount < MAX_RENDERED_ITEMS )
- {
- bItemCount++;
- if ( gWorldItems[ pItemPool->iItemIndex ].bVisible == VISIBLE )
- {
- bVisibleItemCount++;
- }
- }
- // LIMIT RENDERING OF ITEMS TO ABOUT 7, DO NOT RENDER HIDDEN ITEMS TOO!
- if ( bVisibleItemCount == MAX_RENDERED_ITEMS || ( gWorldItems[ pItemPool->iItemIndex ].bVisible != VISIBLE ) || ( pItemPool->usFlags & WORLD_ITEM_DONTRENDER ) )
- {
- if ( !(gTacticalStatus.uiFlags&SHOW_ALL_ITEMS) )
- {
- //CONTINUE, DONOT RENDER
- if(!fLinkedListDirection)
- pNode = pNode->pPrevNode;
- else
- pNode = pNode->pNext;
- continue;
- }
- }
- if ( pItemPool->bRenderZHeightAboveLevel > 0 )
- {
- sYPos -= pItemPool->bRenderZHeightAboveLevel;
- }
- }
- // If render tile is false...
- if ( !fRenderTile )
- {
- if(!fLinkedListDirection)
- pNode = pNode->pPrevNode;
- else
- pNode = pNode->pNext;
- continue;
- }
- }
- // specific code for node types on a per-tile basis
- switch( uiRowFlags )
- {
- case TILES_STATIC_LAND:
- LandZLevel( iTempPosX_M, iTempPosY_M );
- break;
- case TILES_STATIC_OBJECTS:
- // ATE: Modified to use constant z level, as these are same level as land items
- ObjectZLevel( TileElem, pNode, iTempPosX_M, iTempPosY_M );
- break;
- case TILES_STATIC_STRUCTURES:
- StructZLevel( iTempPosX_M, iTempPosY_M );
- if ( fUseTileElem && ( TileElem->uiFlags & MULTI_Z_TILE ) )
- {
- fMultiZBlitter = TRUE;
- }
- // ATE: if we are a wall, set flag
- if ( fUseTileElem && ( TileElem->uiFlags & WALL_TILE ) )
- {
- fWallTile = TRUE;
- }
- break;
- case TILES_STATIC_ROOF:
- RoofZLevel( iTempPosX_M, iTempPosY_M );
- // Automatically adjust height!
- sYPos -= WALL_HEIGHT;
- // ATE: Added for shadows on roofs
- if ( fUseTileElem && ( TileElem->uiFlags & ROOFSHADOW_TILE ) )
- {
- fShadowBlitter=TRUE;
- }
- break;
- case TILES_STATIC_ONROOF:
- OnRoofZLevel( iTempPosX_M, iTempPosY_M );
- // Automatically adjust height!
- sYPos -= WALL_HEIGHT;
- break;
- case TILES_STATIC_TOPMOST:
- TopmostZLevel( iTempPosX_M, iTempPosY_M );
- break;
- case TILES_STATIC_SHADOWS:
-
- ShadowZLevel( iTempPosX_M, iTempPosY_M );
- if ( uiLevelNodeFlags & LEVELNODE_EXITGRID )
- {
- fIntensityBlitter = TRUE;
- fShadowBlitter = FALSE;
- }
- break;
- case TILES_DYNAMIC_LAND:
- LandZLevel( iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- break;
- case TILES_DYNAMIC_SHADOWS:
- ShadowZLevel( iTempPosX_M, iTempPosY_M );
- //sZLevel=SHADOW_Z_LEVEL;
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- break;
- case TILES_DYNAMIC_OBJECTS:
- ObjectZLevel( TileElem, pNode, iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- break;
- case TILES_DYNAMIC_STRUCTURES:
- StructZLevel( iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- break;
- case TILES_DYNAMIC_ROOF:
- sYPos -= WALL_HEIGHT;
- RoofZLevel( iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- // For now, adjust to hieght of a wall ( 50 temp, make define )
- //if ( TileElem->fType > FOOTPRINTS )
- //{
- // sYPos -= 58;
- //}
- break;
- case TILES_DYNAMIC_ONROOF:
- OnRoofZLevel( iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- // Automatically adjust height!
- sYPos -= WALL_HEIGHT;
- break;
- case TILES_DYNAMIC_TOPMOST:
- TopmostZLevel( iTempPosX_M, iTempPosY_M );
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
- break;
- case TILES_DYNAMIC_MERCS:
- case TILES_DYNAMIC_HIGHMERCS:
- case TILES_DYNAMIC_STRUCT_MERCS:
- // Set flag to set layer as used
- uiAdditiveLayerUsedFlags |= uiRowFlags;
- pSoldier=pNode->pSoldier;
- if ( uiRowFlags == TILES_DYNAMIC_MERCS )
- {
- // If we are multi-tiled, ignore here
- if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
- {
- pNode = pNode->pNext;
- continue;
- }
- // If we are at a higher level, no not do anything unless we are at the highmerc stage
- if ( pSoldier->bLevel > 0 )
- {
- pNode = pNode->pNext;
- continue;
- }
- }
- if ( uiRowFlags == TILES_DYNAMIC_HIGHMERCS )
- {
- // If we are multi-tiled, ignore here
- if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
- {
- pNode = pNode->pNext;
- continue;
- }
- // If we are at a lower level, no not do anything unless we are at the highmerc stage
- if ( pSoldier->bLevel == 0 )
- {
- pNode = pNode->pNext;
- continue;
- }
- }
- if ( uiRowFlags == TILES_DYNAMIC_STRUCT_MERCS )
- {
- // If we are not multi-tiled, ignore here
- if ( !( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z ) )
- {
- // If we are at a low level, no not do anything unless we are at the merc stage
- if ( pSoldier->bLevel == 0 )
- {
- pNode = pNode->pNext;
- continue;
- }
- }
- if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
- {
- fSaveZ = TRUE;
- fMultiTransShadowZBlitter = TRUE;
- fZBlitter = TRUE;
- // ATE: Use one direction for queen!
- if ( pSoldier->ubBodyType == QUEENMONSTER )
- {
- sMultiTransShadowZBlitterIndex = 0;
- }
- else
- {
- sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->bDirection ];
- }
- }
-
- }
- // IF we are not active, or are a placeholder for multi-tile animations do nothing
- //if ( !pSoldier->bActive )
- if ( !pSoldier->bActive || (uiLevelNodeFlags & LEVELNODE_MERCPLACEHOLDER) )
- {
- pNode = pNode->pNext;
- continue;
- }
- // Skip if we cannot see the guy!
- if ( pSoldier->bLastRenderVisibleValue == -1 && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
- {
- pNode = pNode->pNext;
- continue;
- }
- // Get animation surface....
- usAnimSurface = GetSoldierAnimationSurface( pSoldier, pSoldier->usAnimState );
- if ( usAnimSurface == INVALID_ANIMATION_SURFACE )
- {
- pNode = pNode->pNext;
- continue;
- }
- // Shade guy always lighter than sceane default!
- {
- UINT8 ubShadeLevel;
- ubShadeLevel = (pNode->ubShadeLevel&0x0f);
- ubShadeLevel=__max(ubShadeLevel-2, DEFAULT_SHADE_LEVEL);
- ubShadeLevel|=(pNode->ubShadeLevel&0x30);
-
- if ( pSoldier->fBeginFade )
- {
- pShadeTable = pSoldier->pCurrentShade = pSoldier->pShades[ pSoldier->ubFadeLevel ];
- }
- else
- {
- pShadeTable = pSoldier->pCurrentShade = pSoldier->pShades[ ubShadeLevel];
- }
- }
- // Position guy based on guy's position
- dOffsetX = pSoldier->dXPos - gsRenderCenterX;
- dOffsetY = pSoldier->dYPos - gsRenderCenterY;
- // Calculate guy's position
- FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
- sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)dTempX_S;
- sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)dTempY_S - sTileHeight;
- // Adjust for offset position on screen
- sXPos -= gsRenderWorldOffsetX;
- sYPos -= gsRenderWorldOffsetY;
- // Adjust for soldier height
- sYPos -= pSoldier->sHeightAdjustment;
- // Handle shade stuff....
- if ( !pSoldier->fBeginFade )
- {
- // Special effect - draw ghost if is seen by a guy in player's team but not current guy
- // ATE: Todo: setup flag for 'bad-guy' - can releive some checks in renderer
- if ( !pSoldier->bNeutral && (pSoldier->bSide != gbPlayerNum ) )
- {
- if ( gusSelectedSoldier != NOBODY )
- {
- pSelSoldier = MercPtrs[ gusSelectedSoldier ];
- }
- else
- {
- pSelSoldier = NULL;
- }
- bGlowShadeOffset = 0;
- if ( gTacticalStatus.ubCurrentTeam == gbPlayerNum )
- {
- // Shade differently depending on visiblity
- if ( pSoldier->bLastRenderVisibleValue == 0 )
- {
- bGlowShadeOffset = 10;
- }
-
- if ( pSelSoldier != NULL )
- {
- if ( pSelSoldier->bOppList[ pSoldier->ubID ] != SEEN_CURRENTLY )
- {
- if ( pSoldier->usAnimState != CHARIOTS_OF_FIRE && pSoldier->usAnimState != BODYEXPLODING )
- {
- bGlowShadeOffset = 10;
- }
- }
- }
- }
- if ( pSoldier->bLevel == 0 )
- {
- pShadeStart = &( pSoldier->pGlowShades[ 0 ] );
- }
- else
- {
- pShadeStart = &( pSoldier->pShades[ 20 ] );
- }
- // Set shade
- // If a bad guy is highlighted
- if ( gfUIHandleSelectionAboveGuy == TRUE && MercPtrs[ gsSelectedGuy ]->bSide != gbPlayerNum )
- {
- if ( gsSelectedGuy == pSoldier->ubID )
- {
- pShadeTable = pShadeStart[ gsGlowFrames[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
- gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
- }
- else
- {
- // Are we dealing with a not-so visible merc?
- if ( bGlowShadeOffset == 10 )
- {
- pShadeTable = pSoldier->pEffectShades[ 0 ];
- }
- }
- }
- else
- {
- // OK,not highlighted, but maybe we are in enemy's turn and they have the baton
- // AI's turn?
- if ( gTacticalStatus.ubCurrentTeam != OUR_TEAM )
- {
- // Does he have baton?
- if ( (pSoldier->uiStatusFlags & SOLDIER_UNDERAICONTROL) )
- {
- pShadeTable = pShadeStart[ gpGlowFramePointer[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
- if ( gpGlowFramePointer[ gsCurrentGlowFrame ] >= 7 )
- {
- gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
- }
- }
- }
- else
- {
- pShadeTable = pShadeStart[ gpGlowFramePointer[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
- if ( gpGlowFramePointer[ gsCurrentGlowFrame ] >= 7 )
- {
- gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
- }
- }
- }
- //if ( gusSelectedSoldier != NOBODY )
- //{
- // pSelSoldier = MercPtrs[ gusSelectedSoldier ];
- // Shade differently depending on visiblity
- // if ( pSoldier->bVisible == 0 || ( pSelSoldier->bOppList[ pSoldier->ubID ] == 0 ) )
- // {
- // Shade gray
- // pShadeTable = pSoldier->pGlowShades[ gpGlowFramePointer[ gsCurrentGlowFrame ] + 10 ];
- // }
- //}
- }
- }
- // Calculate Z level
- SoldierZLevel( pSoldier, iTempPosX_M, iTempPosY_M );
-
- if(!(uiFlags&TILES_DIRTY))
- {
- if ( pSoldier->fForceShade )
- {
- pShadeTable = pSoldier->pForcedShade;
- }
- }
- // check if we are a merc duplicate, if so, only do minimal stuff!
- if ( pSoldier->ubID >= MAX_NUM_SOLDIERS )
- {
- // Shade gray
- pShadeTable = pSoldier->pEffectShades[ 1 ];
- }
- hVObject=gAnimSurfaceDatabase[ usAnimSurface ].hVideoObject;
- if ( hVObject == NULL )
- {
- pNode = pNode->pNext;
- continue;
- }
- // ATE: If we are in a gridno that we should not use obscure blitter, set!
- if ( !( gpWorldLevelData[ uiTileIndex ].ubExtFlags[0] & MAPELEMENT_EXT_NOBURN_STRUCT ) )
- {
- fObscuredBlitter = TRUE;
- }
- else
- {
- // ATE: Artificially increase z=level...
- sZLevel += 2;
- }
- usImageIndex=pSoldier->usAniFrame;
- uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED| BGND_FLAG_MERC;
- break;
- }
- // Adjust for interface level
- sYPos += gsRenderHeight;
- // OK, check for LEVELNODE HIDDEN...
- fHiddenTile = FALSE;
- if ( uiLevelNodeFlags & LEVELNODE_HIDDEN )
- {
- fHiddenTile = TRUE;
- if ( TileElem != NULL )
- {
- // If we are a roof and have SHOW_ALL_ROOFS on, turn off hidden tile check!
- if ( ( TileElem->uiFlags & ROOF_TILE ) && ( gTacticalStatus.uiFlags&SHOW_ALL_ROOFS ) )
- {
- // Turn off
- fHiddenTile = FALSE;
- }
- }
- }
- if( fRenderTile && !fHiddenTile )
- {
- fTileInvisible = FALSE;
- if ( ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE ) )
- {
- // Set fmerc flag!
- fMerc = TRUE;
- fZWrite = TRUE;
- //if ( hVObject->ppZStripInfo != NULL )
- {
- sMultiTransShadowZBlitterIndex = GetCorpseStructIndex( &( pCorpse->def ), TRUE );
- fMultiTransShadowZBlitter = TRUE;
- }
- }
- if ( (uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC ) && !(uiFlags&TILES_DIRTY) )
- {
- // Remove flags!
- pNode->uiFlags &= (~LEVELNODE_LASTDYNAMIC );
- fZWrite = TRUE;
- }
- if ( uiLevelNodeFlags & LEVELNODE_NOWRITEZ )
- {
- fZWrite = FALSE;
- }
- if(uiFlags&TILES_NOZWRITE)
- fZWrite=FALSE;
- if ( uiFlags & TILES_NOZ )
- {
- fZBlitter = FALSE;
- }
- if ( ( uiLevelNodeFlags & LEVELNODE_WIREFRAME ) )
- {
- if ( !gGameSettings.fOptions[ TOPTION_TOGGLE_WIREFRAME ] )
- {
- fTileInvisible = TRUE;
- }
- }
- // RENDER
- if ( fTileInvisible )
- {
- }
- else if ( uiLevelNodeFlags & LEVELNODE_DISPLAY_AP && !( uiFlags&TILES_DIRTY ) )
- {
- pTrav = &(hVObject->pETRLEObject[usImageIndex]);
- sXPos += pTrav->sOffsetX;
- sYPos += pTrav->sOffsetY;
- if ( gfUIDisplayActionPointsInvalid )
- {
- SetFontBackground( FONT_MCOLOR_BLACK );
- SetFontForeground( FONT_MCOLOR_WHITE );
- }
- else
- {
- SetFontBackground( FONT_MCOLOR_BLACK );
- SetFontForeground( FONT_MCOLOR_WHITE );
- }
-
- if ( gfUIDisplayActionPointsBlack )
- {
- SetFontBackground( FONT_MCOLOR_BLACK );
- SetFontForeground( FONT_MCOLOR_BLACK );
- }
- SetFont( TINYFONT1 );
- SetFontDestBuffer( guiSAVEBUFFER , 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, FALSE );
- VarFindFontCenterCoordinates( sXPos, sYPos, 1, 1, TINYFONT1, &sX, &sY, L"%d", pNode->uiAPCost );
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", pNode->uiAPCost );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
- else if ( ( uiLevelNodeFlags & LEVELNODE_ERASEZ ) && !( uiFlags&TILES_DIRTY ) )
- {
- Zero8BPPDataTo16BPPBufferTransparent( (UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex );
- //Zero8BPPDataTo16BPPBufferTransparent( (UINT16*)gpZBuffer, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex );
- }
- else if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && !( uiFlags&TILES_DIRTY ) )
- {
- BOOLEAN fZBlit = FALSE;
- if ( uiRowFlags == TILES_STATIC_ONROOF || uiRowFlags == TILES_DYNAMIC_ONROOF )
- {
- usOutlineColor = gusYellowItemOutlineColor;
- bItemOutline = TRUE;
- fZBlit = TRUE;
- }
- else
- {
- usOutlineColor = gusNormalItemOutlineColor;
- bItemOutline = TRUE;
- fZBlit = TRUE;
- }
- if ( gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] )
- {
- if ( uiRowFlags == TILES_STATIC_ONROOF || uiRowFlags == TILES_DYNAMIC_ONROOF )
- {
- usOutlineColor = us16BPPItemCycleYellowColors[ gsCurrentItemGlowFrame ];
- bItemOutline = TRUE;
- }
- else
- {
- if ( gTacticalStatus.uiFlags & RED_ITEM_GLOW_ON )
- {
- usOutlineColor = us16BPPItemCycleRedColors[ gsCurrentItemGlowFrame ];
- bItemOutline = TRUE;
- }
- else
- {
- usOutlineColor = us16BPPItemCycleWhiteColors[ gsCurrentItemGlowFrame ];
- bItemOutline = TRUE;
- }
- }
- }
- //else
- //{
- // usOutlineColor = us16BPPItemCycleWhiteColors[ pItemPool->bFlashColor ];
- // bItemOutline = TRUE;
- //}
- bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- if ( bBlitClipVal == FALSE )
- {
- if ( fZBlit )
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferOutlineZPixelateObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
- }
- else
- {
- Blt8BPPDataTo16BPPBufferOutlineZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferOutline((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
- }
- }
- else if ( bBlitClipVal == TRUE )
- {
- if ( fZBlit )
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferOutlineZPixelateObscuredClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
- }
- else
- {
- Blt8BPPDataTo16BPPBufferOutlineZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferOutlineClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
- }
- }
- }
- // ATE: Check here for a lot of conditions!
- else if ( ( ( uiLevelNodeFlags & LEVELNODE_PHYSICSOBJECT ) ) && !( uiFlags&TILES_DIRTY ) )
- {
- bItemOutline = TRUE;
- if ( uiLevelNodeFlags & LEVELNODE_PHYSICSOBJECT )
- {
- bItemOutline = FALSE;
- }
- bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- if ( fShadowBlitter )
- {
- if ( bBlitClipVal == FALSE )
- {
- Blt8BPPDataTo16BPPBufferShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex );
- }
- else
- {
- Blt8BPPDataTo16BPPBufferShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
- }
- }
- else
- {
- if ( bBlitClipVal == FALSE )
- {
- Blt8BPPDataTo16BPPBufferOutlineZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
- }
- else if ( bBlitClipVal == TRUE )
- {
- Blt8BPPDataTo16BPPBufferOutlineClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
- }
- }
- }
- else if(uiFlags&TILES_DIRTY)
- {
- if ( !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC ) )
- {
- pTrav = &(hVObject->pETRLEObject[usImageIndex]);
- uiBrushHeight = (UINT32)pTrav->usHeight;
- uiBrushWidth = (UINT32)pTrav->usWidth;
- sXPos += pTrav->sOffsetX;
- sYPos += pTrav->sOffsetY;
- RegisterBackgroundRect(uiDirtyFlags, NULL, sXPos, sYPos, (INT16)(sXPos + uiBrushWidth), (INT16)(__min((INT16)(sYPos + uiBrushHeight), gsVIEWPORT_WINDOW_END_Y)));
- if ( fSaveZ )
- {
- RegisterBackgroundRect(uiDirtyFlags | BGND_FLAG_SAVE_Z, NULL, sXPos, sYPos, (INT16)(sXPos + uiBrushWidth), (INT16)(__min((INT16)(sYPos + uiBrushHeight), gsVIEWPORT_WINDOW_END_Y)));
- }
- }
- }
- else
- {
- if(gbPixelDepth==16)
- {
- /*if(fConvertTo16)
- {
- ConvertVObjectRegionTo16BPP(hVObject, usImageIndex, 4);
- if(CheckFor16BPPRegion(hVObject, usImageIndex, 4, &us16BPPIndex))
- {
- Blt16BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, us16BPPIndex, &gClippingRect);
- }
- }*/
- if( fMultiTransShadowZBlitter )
- {
- if ( fZBlitter )
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect, sMultiTransShadowZBlitterIndex, pShadeTable );
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect, sMultiTransShadowZBlitterIndex, pShadeTable );
- }
- }
- else
- {
- //Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
- }
- }
- else if( fMultiZBlitter )
- {
- if ( fZBlitter )
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransZIncObscureClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- if ( fWallTile )
- {
- Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransZIncClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
- }
- }
- else
- {
- bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- if ( bBlitClipVal == TRUE )
- {
- if(fPixelate)
- {
- if(fTranslucencyType)
- {
- //if(fZWrite)
- // Blt8BPPDataTo16BPPBufferTransZClipTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- //else
- Blt8BPPDataTo16BPPBufferTransZNBClipTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- //if(fZWrite)
- // Blt8BPPDataTo16BPPBufferTransZClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- //else
- Blt8BPPDataTo16BPPBufferTransZNBClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- }
- else if(fMerc)
- {
- if ( fZBlitter )
- {
- if ( fZWrite )
- {
- Blt8BPPDataTo16BPPBufferTransShadowZClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- }
- else
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransShadowZNBObscuredClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- }
- }
- if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
- {
- pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
- // BLIT HERE
- Blt8BPPDataTo16BPPBufferTransShadowClip( (UINT16*)pSaveBuf, uiSaveBufferPitchBYTES,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- UnLockVideoSurface(guiSAVEBUFFER);
- // Turn it off!
- pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransShadowClip( (UINT16*)pDestBuf, uiDestPitchBYTES,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- }
- }
- else if(fShadowBlitter)
- {
- if ( fZBlitter )
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- else
- Blt8BPPDataTo16BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferShadowClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- }
- else if( fIntensityBlitter)
- {
- if ( fZBlitter )
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferIntensityZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- else
- Blt8BPPDataTo16BPPBufferIntensityZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferIntensityClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- }
- else if(fZBlitter)
- {
- if(fZWrite)
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransZClipPixelateObscured((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransZNBClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
- {
- pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
- // BLIT HERE
- Blt8BPPDataTo16BPPBufferTransZClip((UINT16*)pSaveBuf, uiSaveBufferPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- UnLockVideoSurface(guiSAVEBUFFER);
- // Turn it off!
- pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
- }
- }
- else
- Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else if ( bBlitClipVal == FALSE )
- {
- if(fPixelate)
- {
- if(fTranslucencyType)
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferTransZTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo16BPPBufferTransZNBTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferTransZPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo16BPPBufferTransZNBPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- else if(fMerc)
- {
- if ( fZBlitter )
- {
- if ( fZWrite )
- {
- Blt8BPPDataTo16BPPBufferTransShadowZ( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- }
- else
- {
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransShadowZNBObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- }
- }
- if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
- {
- pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
- // BLIT HERE
- Blt8BPPDataTo16BPPBufferTransShadow( (UINT16*)pSaveBuf, uiSaveBufferPitchBYTES,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- UnLockVideoSurface(guiSAVEBUFFER);
- // Turn it off!
- pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
- }
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransShadow( (UINT16*)pDestBuf, uiDestPitchBYTES,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- }
- }
- else if(fShadowBlitter)
- {
- if ( fZBlitter )
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferShadowZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo16BPPBufferShadowZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferShadow((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- else if( fIntensityBlitter )
- {
- if ( fZBlitter )
- {
- if(fZWrite)
- Blt8BPPDataTo16BPPBufferIntensityZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo16BPPBufferIntensityZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferIntensity((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- else if(fZBlitter)
- {
- if(fZWrite)
- {
- // TEST
- //Blt8BPPDataTo16BPPBufferTransZPixelate( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- if ( fObscuredBlitter )
- {
- Blt8BPPDataTo16BPPBufferTransZPixelateObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else
- {
- Blt8BPPDataTo16BPPBufferTransZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- else
- Blt8BPPDataTo16BPPBufferTransZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
- {
- pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
- // BLIT HERE
- Blt8BPPDataTo16BPPBufferTransZ((UINT16*)pSaveBuf, uiSaveBufferPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex );
- UnLockVideoSurface(guiSAVEBUFFER);
- // Turn it off!
- pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
- }
- }
- else
- Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- }
- else // 8bpp section
- {
- if(fPixelate)
- {
- if(fZWrite)
- Blt8BPPDataTo8BPPBufferTransZClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- else
- Blt8BPPDataTo8BPPBufferTransZNBClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else if(BltIsClipped(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect))
- {
- if(fMerc)
- {
- Blt8BPPDataTo8BPPBufferTransShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- &gClippingRect,
- pShadeTable);
- }
- else if(fShadowBlitter)
- if(fZWrite)
- Blt8BPPDataTo8BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- else
- Blt8BPPDataTo8BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
-
- else if(fZBlitter)
- {
- if(fZWrite)
- Blt8BPPDataTo8BPPBufferTransZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- else
- Blt8BPPDataTo8BPPBufferTransZNBClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- Blt8BPPDataTo8BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
- }
- else
- {
- if(fMerc)
- {
- Blt8BPPDataTo16BPPBufferTransShadowZNBObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- hVObject,
- sXPos, sYPos,
- usImageIndex,
- pShadeTable);
- // Blt8BPPDataTo8BPPBufferTransShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
- // hVObject,
- // sXPos, sYPos,
- // usImageIndex,
- // pShadeTable);
- }
- else if(fShadowBlitter)
- {
- if(fZWrite)
- Blt8BPPDataTo8BPPBufferShadowZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo8BPPBufferShadowZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else if(fZBlitter)
- {
- if(fZWrite)
- Blt8BPPDataTo8BPPBufferTransZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- else
- Blt8BPPDataTo8BPPBufferTransZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
- }
- else
- Blt8BPPDataTo8BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
- }
- }
- }
-
- // RENDR APS ONTOP OF PLANNED MERC GUY
- if ( fRenderTile && !( uiFlags&TILES_DIRTY ) )
- {
- if ( fMerc )
- {
- if ( pSoldier != NULL && pSoldier->ubID >= MAX_NUM_SOLDIERS )
- {
- SetFont( TINYFONT1 );
- SetFontDestBuffer( guiSAVEBUFFER , 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, FALSE );
- VarFindFontCenterCoordinates( sXPos, sYPos, 1, 1, TINYFONT1, &sX, &sY, L"%d", pSoldier->ubPlannedUIAPCost );
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", pSoldier->ubPlannedUIAPCost );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
- }
- }
- }
- if(!fLinkedListDirection)
- pNode = pNode->pPrevNode;
- else
- pNode = pNode->pNext;
- //pNode = NULL;
- }
- }
- else
- {
- if( gfEditMode )
- {
- //ATE: Used here in the editor to denote then an area is not in the world
- //Kris: Fixed a couple things here...
- // First, there was a problem with the FRAME_BUFFER already being locked which caused failures,
- // and eventual crashes, so if it reaches this code, the buffer needs to be unlocked first, as
- // it gets locked and unlocked internally within ColorFillVideoSurfaceArea(). I'm surprised
- // this problem didn't surface a long time ago. Anyway, it seems that scrolling to the bottom
- // right hand corner of the map, would cause the end of the world to be drawn. Now, this would
- // only crash on my computer and not Emmons, so this should work. Also, I changed the color
- // from fluorescent green to black, which is easier on the eyes, and prevent the drawing of the
- // end of the world if it would be drawn on the editor's taskbar.
- if( iTempPosY_S < 360 )
- {
- if(!(uiFlags&TILES_DIRTY))
- UnLockVideoSurface( FRAME_BUFFER );
- ColorFillVideoSurfaceArea( FRAME_BUFFER, iTempPosX_S, iTempPosY_S, (INT16)(iTempPosX_S + 40),
- (INT16)( min( iTempPosY_S + 20, 360 )), Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
- if(!(uiFlags&TILES_DIRTY))
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- }
- }
- }
- iTempPosX_S += 40;
- iTempPosX_M ++;
- iTempPosY_M --;
- if ( iTempPosX_S >= iEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- }
- }
- // } while( FALSE );
- if ( bXOddFlag > 0 )
- {
- iAnchorPosY_M ++;
- }
- else
- {
- iAnchorPosX_M ++;
- }
- bXOddFlag = !bXOddFlag;
- iAnchorPosY_S += 10;
- if ( iAnchorPosY_S >= iEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- if(!(uiFlags&TILES_DIRTY))
- UnLockVideoSurface( FRAME_BUFFER );
- if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
- {
- EndCurInteractiveTileCheck( );
- }
- }
- void DeleteFromWorld( UINT16 usTileIndex, UINT32 uiRenderTiles, UINT16 usIndex )
- {
- switch( uiRenderTiles )
- {
- case TILES_DYNAMIC_LAND:
- case TILES_STATIC_LAND:
- RemoveLand( usTileIndex, usIndex );
- break;
- case TILES_DYNAMIC_OBJECTS:
- case TILES_STATIC_OBJECTS:
- RemoveObject( usTileIndex, usIndex );
- break;
- case TILES_STATIC_STRUCTURES:
- case TILES_DYNAMIC_STRUCTURES:
- RemoveStruct( usTileIndex, usIndex );
- break;
- case TILES_DYNAMIC_ROOF:
- case TILES_STATIC_ROOF:
- RemoveRoof( usTileIndex, usIndex );
- break;
- case TILES_STATIC_ONROOF:
- RemoveOnRoof( usTileIndex, usIndex );
- break;
- case TILES_DYNAMIC_TOPMOST:
- case TILES_STATIC_TOPMOST:
- RemoveTopmost( usTileIndex, usIndex );
- break;
- }
- }
- // memcpy's the background to the new scroll position, and renders the missing strip
- // via the RenderStaticWorldRect. Dynamic stuff will be updated on the next frame
- // by the normal render cycle
- void ScrollBackground(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScrollYIncrement )
- {
- //RestoreBackgroundRects();
- if ( !gfDoVideoScroll )
- {
- // Clear z-buffer
- memset(gpZBuffer, LAND_Z_LEVEL, 1280* gsVIEWPORT_END_Y );
- RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y, FALSE );
- FreeBackgroundRectType(BGND_FLAG_ANIMATED);
- }
- else
- {
- if ( gfRenderScroll == FALSE )
- {
- guiScrollDirection = uiDirection;
- gfScrollStart = TRUE;
- gsScrollXIncrement = 0;
- gsScrollYIncrement = 0;
- }
- else
- {
- guiScrollDirection |= uiDirection;
- gfScrollStart = FALSE;
- }
- gfRenderScroll = TRUE;
- gsScrollXIncrement += sScrollXIncrement;
- gsScrollYIncrement += sScrollYIncrement;
- }
- }
- // Render routine takes center X, Y and Z coordinate and gets world
- // Coordinates for the window from that using the following functions
- // For coordinate transformations
- void RenderWorld( )
- {
- TILE_ELEMENT *TileElem;
- TILE_ANIMATION_DATA *pAnimData;
- UINT32 cnt = 0;
- gfRenderFullThisFrame = FALSE;
- // If we are testing renderer, set background to pink!
- if ( gTacticalStatus.uiFlags & DEBUGCLIFFS )
- {
- ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, Get16BPPColor( FROMRGB( 0, 255, 0 ) ) );
- SetRenderFlags(RENDER_FLAG_FULL);
- }
- if ( gTacticalStatus.uiFlags & SHOW_Z_BUFFER )
- {
- SetRenderFlags(RENDER_FLAG_FULL);
- }
- // SetRenderFlags(RENDER_FLAG_FULL);
- // FOR NOW< HERE, UPDATE ANIMATED TILES
- if ( COUNTERDONE( ANIMATETILES ) )
- {
- RESETCOUNTER( ANIMATETILES );
- while( cnt < gusNumAnimatedTiles )
- {
- TileElem = &(gTileDatabase[ gusAnimatedTiles[ cnt ] ] );
- pAnimData = TileElem->pAnimData;
- Assert( pAnimData != NULL );
- pAnimData->bCurrentFrame++;
- if ( pAnimData->bCurrentFrame >= pAnimData->ubNumFrames )
- pAnimData->bCurrentFrame = 0;
- cnt++;
- }
- }
- // HERE, UPDATE GLOW INDEX
- if ( COUNTERDONE( GLOW_ENEMYS ) )
- {
- RESETCOUNTER( GLOW_ENEMYS );
- gsCurrentGlowFrame++;
- if ( gsCurrentGlowFrame == NUM_GLOW_FRAMES )
- {
- gsCurrentGlowFrame = 0;
- }
- gsCurrentItemGlowFrame++;
- if ( gsCurrentItemGlowFrame == NUM_ITEM_CYCLE_COLORS )
- {
- gsCurrentItemGlowFrame = 0;
- }
- }
- //RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- //return;
- //#if 0
- if(gRenderFlags&RENDER_FLAG_FULL)
- {
- gfRenderFullThisFrame = TRUE;
- gfTopMessageDirty = TRUE;
- // Dirty the interface...
- fInterfacePanelDirty = DIRTYLEVEL2;
- // Apply scrolling sets some world variables
- ApplyScrolling( gsRenderCenterX, gsRenderCenterY, TRUE, FALSE );
- ResetLayerOptimizing();
- if ( (gRenderFlags&RENDER_FLAG_NOZ ) )
- {
- RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y, FALSE );
- }
- else
- {
- RenderStaticWorld();
- }
- if(!(gRenderFlags&RENDER_FLAG_SAVEOFF))
- UpdateSaveBuffer();
- }
- else if(gRenderFlags&RENDER_FLAG_MARKED)
- {
- ResetLayerOptimizing();
- RenderMarkedWorld();
- if(!(gRenderFlags&RENDER_FLAG_SAVEOFF))
- UpdateSaveBuffer();
-
- }
- if ( gfScrollInertia == FALSE || (gRenderFlags&RENDER_FLAG_NOZ ) || (gRenderFlags&RENDER_FLAG_FULL ) || (gRenderFlags&RENDER_FLAG_MARKED ) )
- {
- RenderDynamicWorld( );
- }
- if ( gfScrollInertia )
- {
- EmptyBackgroundRects( );
- }
-
- if( gRenderFlags&RENDER_FLAG_ROOMIDS )
- {
- RenderRoomInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- #ifdef _DEBUG
- if( gRenderFlags&RENDER_FLAG_FOVDEBUG )
- {
- RenderFOVDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- else if (gfDisplayCoverValues)
- {
- RenderCoverDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- else if (gfDisplayGridNoVisibleValues)
- {
- RenderGridNoVisibleDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- #endif
- //#endif
- //RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- if(gRenderFlags&RENDER_FLAG_MARKED)
- ClearMarkedTiles();
- if ( gRenderFlags&RENDER_FLAG_CHECKZ && !(gTacticalStatus.uiFlags & NOHIDE_REDUNDENCY) )
- {
- ExamineZBufferRect( gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
- }
- gRenderFlags&=(~(RENDER_FLAG_FULL|RENDER_FLAG_MARKED|RENDER_FLAG_ROOMIDS|RENDER_FLAG_CHECKZ));
- if ( gTacticalStatus.uiFlags & SHOW_Z_BUFFER )
- {
- // COPY Z BUFFER TO FRAME BUFFER
- UINT32 uiDestPitchBYTES;
- UINT16 *pDestBuf;
- UINT32 cnt;
- INT16 zVal;
- pDestBuf = (INT16*)LockVideoSurface(guiRENDERBUFFER, &uiDestPitchBYTES);
- for ( cnt = 0; cnt < ( 640 * 480 ); cnt++ )
- {
- // Get Z value
- zVal = gpZBuffer[ cnt ];
- pDestBuf[cnt] = zVal;
- }
- UnLockVideoSurface(guiRENDERBUFFER);
- }
- }
- // Start with a center X,Y,Z world coordinate and render direction
- // Determine WorldIntersectionPoint and the starting block from these
- // Then render away!
- void RenderStaticWorldRect(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom, BOOLEAN fDynamicsToo )
- {
- UINT32 uiLevelFlags[10];
- UINT16 sLevelIDs[10];
- // Calculate render starting parameters
- CalcRenderParameters( sLeft, sTop, sRight, sBottom );
- // Reset layer optimizations
- ResetLayerOptimizing( );
- // STATICS
- uiLevelFlags[0] = TILES_STATIC_LAND;
- //uiLevelFlags[1] = TILES_STATIC_OBJECTS;
- sLevelIDs[0] = RENDER_STATIC_LAND;
- //sLevelIDs[1] = RENDER_STATIC_OBJECTS;
- RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
- //#if 0
- uiLevelFlags[0] = TILES_STATIC_OBJECTS;
- sLevelIDs[0] = RENDER_STATIC_OBJECTS;
- RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
- if(gRenderFlags&RENDER_FLAG_SHADOWS )
- {
- uiLevelFlags[0] = TILES_STATIC_SHADOWS;
- sLevelIDs[0] = RENDER_STATIC_SHADOWS;
- RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags , sLevelIDs );
- }
- uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
- uiLevelFlags[1] = TILES_STATIC_ROOF;
- uiLevelFlags[2] = TILES_STATIC_ONROOF;
- uiLevelFlags[3] = TILES_STATIC_TOPMOST;
- sLevelIDs[0] = RENDER_STATIC_STRUCTS;
- sLevelIDs[1] = RENDER_STATIC_ROOF;
- sLevelIDs[2] = RENDER_STATIC_ONROOF;
- sLevelIDs[3] = RENDER_STATIC_TOPMOST;
- RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 4, uiLevelFlags, sLevelIDs );
- //ATE: Do obsucred layer!
- uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
- sLevelIDs[0] = RENDER_STATIC_STRUCTS;
- uiLevelFlags[1] = TILES_STATIC_ONROOF;
- sLevelIDs[1] = RENDER_STATIC_ONROOF;
- RenderTiles( TILES_OBSCURED, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 2, uiLevelFlags, sLevelIDs );
- //uiLevelFlags[0] = TILES_DYNAMIC_MERCS;
- //uiLevelFlags[1] = TILES_DYNAMIC_HIGHMERCS;
- //sLevelIDs[0] = RENDER_DYNAMIC_MERCS;
- //sLevelIDs[1] = RENDER_DYNAMIC_HIGHMERCS;
- //RenderTiles( 0, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
- if ( fDynamicsToo )
- {
- // DYNAMICS
- uiLevelFlags[0] = TILES_DYNAMIC_LAND;
- uiLevelFlags[1] = TILES_DYNAMIC_OBJECTS;
- uiLevelFlags[2] = TILES_DYNAMIC_SHADOWS;
- uiLevelFlags[3] = TILES_DYNAMIC_STRUCT_MERCS;
- uiLevelFlags[4] = TILES_DYNAMIC_MERCS;
- uiLevelFlags[5] = TILES_DYNAMIC_STRUCTURES;
- uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
- uiLevelFlags[7] = TILES_DYNAMIC_HIGHMERCS;
- uiLevelFlags[8] = TILES_DYNAMIC_ONROOF;
-
- sLevelIDs[0] = RENDER_DYNAMIC_LAND;
- sLevelIDs[1] = RENDER_DYNAMIC_OBJECTS;
- sLevelIDs[2] = RENDER_DYNAMIC_SHADOWS;
- sLevelIDs[3] = RENDER_DYNAMIC_STRUCT_MERCS;
- sLevelIDs[4] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[5] = RENDER_DYNAMIC_STRUCTS;
- sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
- sLevelIDs[7] = RENDER_DYNAMIC_HIGHMERCS;
- sLevelIDs[8] = RENDER_DYNAMIC_ONROOF;
- RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 9, uiLevelFlags , sLevelIDs );
- SumAddiviveLayerOptimization( );
- }
- ResetRenderParameters( );
- if ( !gfDoVideoScroll )
- {
- //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
- AddBaseDirtyRect(sLeft, sTop, sRight, sBottom );
- }
- //#endif
- }
- void RenderStaticWorld( )
- {
- UINT32 uiLevelFlags[9];
- UINT16 sLevelIDs[9];
- // Calculate render starting parameters
- CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- // Clear z-buffer
- memset(gpZBuffer, LAND_Z_LEVEL, 1280* gsVIEWPORT_END_Y );
- FreeBackgroundRectType(BGND_FLAG_ANIMATED);
- InvalidateBackgroundRects();
- uiLevelFlags[0] = TILES_STATIC_LAND;
- //uiLevelFlags[1] = TILES_STATIC_OBJECTS;
- sLevelIDs[0] = RENDER_STATIC_LAND;
- //sLevelIDs[1] = RENDER_STATIC_OBJECTS;
- RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
- uiLevelFlags[0] = TILES_STATIC_OBJECTS;
- sLevelIDs[0] = RENDER_STATIC_OBJECTS;
- RenderTiles( 0 , gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
- if(gRenderFlags&RENDER_FLAG_SHADOWS )
- {
- uiLevelFlags[0] = TILES_STATIC_SHADOWS;
- sLevelIDs[0] = RENDER_STATIC_SHADOWS;
- RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags , sLevelIDs );
- }
- uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
- uiLevelFlags[1] = TILES_STATIC_ROOF;
- uiLevelFlags[2] = TILES_STATIC_ONROOF;
- uiLevelFlags[3] = TILES_STATIC_TOPMOST;
- sLevelIDs[0] = RENDER_STATIC_STRUCTS;
- sLevelIDs[1] = RENDER_STATIC_ROOF;
- sLevelIDs[2] = RENDER_STATIC_ONROOF;
- sLevelIDs[3] = RENDER_STATIC_TOPMOST;
- RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 4, uiLevelFlags, sLevelIDs );
- //ATE: Do obsucred layer!
- uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
- sLevelIDs[0] = RENDER_STATIC_STRUCTS;
- uiLevelFlags[1] = TILES_STATIC_ONROOF;
- sLevelIDs[1] = RENDER_STATIC_ONROOF;
- RenderTiles( TILES_OBSCURED, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 2, uiLevelFlags, sLevelIDs );
- AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
- ResetRenderParameters( );
- }
-
- void RenderMarkedWorld(void)
- {
- UINT32 uiLevelFlags[4];
- UINT16 sLevelIDs[4];
- CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- RestoreBackgroundRects();
- FreeBackgroundRectType(BGND_FLAG_ANIMATED);
- InvalidateBackgroundRects();
- ResetLayerOptimizing();
- uiLevelFlags[0] = TILES_STATIC_LAND;
- uiLevelFlags[1] = TILES_STATIC_OBJECTS;
- sLevelIDs[0] = RENDER_STATIC_LAND;
- sLevelIDs[1] = RENDER_STATIC_OBJECTS;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 2, uiLevelFlags, sLevelIDs );
- if(gRenderFlags&RENDER_FLAG_SHADOWS)
- {
- uiLevelFlags[0] = TILES_STATIC_SHADOWS;
- sLevelIDs[0] = RENDER_STATIC_SHADOWS;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
- }
- uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
- sLevelIDs[0] = RENDER_STATIC_STRUCTS;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
- uiLevelFlags[0] = TILES_STATIC_ROOF;
- sLevelIDs[0] = RENDER_STATIC_ROOF;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
- uiLevelFlags[0] = TILES_STATIC_ONROOF;
- sLevelIDs[0] = RENDER_STATIC_ONROOF;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
-
- uiLevelFlags[0] = TILES_STATIC_TOPMOST;
- sLevelIDs[0] = RENDER_STATIC_TOPMOST;
- RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
-
- AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
- ResetRenderParameters( );
- }
- void RenderDynamicWorld( )
- {
- UINT8 ubNumLevels;
- UINT32 uiLevelFlags[ 10 ];
- UINT16 sLevelIDs[ 10 ];
- CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
- RestoreBackgroundRects();
- if(!gfTagAnimatedTiles)
- {
- uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
- uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
- uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
- uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
- uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
- uiLevelFlags[5] = TILES_DYNAMIC_HIGHMERCS;
- uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
- uiLevelFlags[7] = TILES_DYNAMIC_ONROOF;
- uiLevelFlags[8] = TILES_DYNAMIC_TOPMOST;
- sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
- sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
- sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
- sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
- sLevelIDs[5] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
- sLevelIDs[7] = RENDER_DYNAMIC_ONROOF;
- sLevelIDs[8] = RENDER_DYNAMIC_TOPMOST;
- ubNumLevels = 9;
- }
- else
- {
- gfTagAnimatedTiles=FALSE;
- //uiLevelFlags[0] = TILES_DYNAMIC_LAND;
- uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
- uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
- uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
- uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
- uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
- uiLevelFlags[5] = TILES_DYNAMIC_HIGHMERCS;
- uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
- uiLevelFlags[7] = TILES_DYNAMIC_ONROOF;
- uiLevelFlags[8] = TILES_DYNAMIC_TOPMOST;
- //sLevelIDs[0] = RENDER_DYNAMIC_LAND;
- sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
- sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
- sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
- sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
- sLevelIDs[5] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
- sLevelIDs[7] = RENDER_DYNAMIC_ONROOF;
- sLevelIDs[8] = RENDER_DYNAMIC_TOPMOST;
- ubNumLevels = 9;
- }
-
- RenderTiles(TILES_DIRTY, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, ubNumLevels, uiLevelFlags, sLevelIDs );
- #ifdef JA2EDITOR
- if( !gfEditMode && !gfAniEditMode )
- #endif
- {
- RenderTacticalInterface( );
- }
- SaveBackgroundRects();
-
- //uiLevelFlags[0] = TILES_DYNAMIC_LAND;
- uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
- uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
- uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
- uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
- uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
- //sLevelIDs[0] = RENDER_DYNAMIC_LAND;
- sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
- sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
- sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
- sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
- sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
- RenderTiles( 0, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 5, uiLevelFlags , sLevelIDs );
- uiLevelFlags[0] = TILES_DYNAMIC_ROOF;
- uiLevelFlags[1] = TILES_DYNAMIC_HIGHMERCS;
- uiLevelFlags[2] = TILES_DYNAMIC_ONROOF;
- sLevelIDs[0] = RENDER_DYNAMIC_ROOF;
- sLevelIDs[1] = RENDER_DYNAMIC_HIGHMERCS;
- sLevelIDs[2] = RENDER_DYNAMIC_ONROOF;
- RenderTiles(0 , gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 3, uiLevelFlags, sLevelIDs );
- uiLevelFlags[0] = TILES_DYNAMIC_TOPMOST;
- sLevelIDs[0] = RENDER_DYNAMIC_TOPMOST;
- // ATE: check here for mouse over structs.....
- RenderTiles( TILES_DYNAMIC_CHECKFOR_INT_TILE, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
- SumAddiviveLayerOptimization( );
- ResetRenderParameters( );
- }
- BOOLEAN HandleScrollDirections( UINT32 ScrollFlags, INT16 sScrollXStep, INT16 sScrollYStep, INT16 *psTempRenderCenterX, INT16 *psTempRenderCenterY, BOOLEAN fCheckOnly )
- {
- BOOLEAN fAGoodMove = FALSE, fMovedPos = FALSE;
- INT16 sTempX_W, sTempY_W;
- BOOLEAN fUpOK, fLeftOK;
- BOOLEAN fDownOK, fRightOK;
- INT16 sTempRenderCenterX, sTempRenderCenterY;
- sTempRenderCenterX = sTempRenderCenterY = 0;
- // This checking sequence just validates the values!
- if ( ScrollFlags & SCROLL_LEFT )
- {
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fMovedPos )
- {
- fAGoodMove = TRUE;
- }
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
- }
- }
- if ( ScrollFlags & SCROLL_RIGHT )
- {
- FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fMovedPos )
- {
- fAGoodMove = TRUE;
- }
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_RIGHT, sScrollXStep, sScrollYStep );
- }
- }
-
- if ( ScrollFlags & SCROLL_UP )
- {
- FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fMovedPos )
- {
- fAGoodMove = TRUE;
- }
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
- }
- }
- if ( ScrollFlags & SCROLL_DOWN )
- {
- FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fMovedPos )
- {
- fAGoodMove = TRUE;
- }
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_DOWN, sScrollXStep, sScrollYStep );
- }
- }
- if ( ScrollFlags & SCROLL_UPLEFT )
- {
- // Check up
- FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fUpOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- // Check left
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fLeftOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fLeftOK && fUpOK )
- {
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_UPLEFT, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fUpOK )
- {
- fAGoodMove = TRUE;
- FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fLeftOK )
- {
- fAGoodMove = TRUE;
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
- }
- }
- }
- if ( ScrollFlags & SCROLL_UPRIGHT )
- {
- // Check up
- FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fUpOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
-
- // Check right
- FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fRightOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fUpOK && fRightOK )
- {
- FromScreenToCellCoordinates( (INT16)sScrollXStep, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_UPRIGHT, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fUpOK )
- {
- fAGoodMove = TRUE;
- FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fRightOK )
- {
- fAGoodMove = TRUE;
- FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_RIGHT, sScrollXStep, sScrollYStep );
- }
- }
- }
- if ( ScrollFlags & SCROLL_DOWNLEFT )
- {
- // Check down......
- FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fDownOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- // Check left.....
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fLeftOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fLeftOK && fDownOK )
- {
- fAGoodMove = TRUE;
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, (INT16)sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_DOWNLEFT, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fLeftOK )
- {
- FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fDownOK )
- {
- FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground(SCROLL_DOWN, sScrollXStep, sScrollYStep );
- }
- }
- }
- if ( ScrollFlags & SCROLL_DOWNRIGHT )
- {
- // Check right
- FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fRightOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- // Check down
- FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fDownOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
- if ( fDownOK && fRightOK )
- {
- FromScreenToCellCoordinates( (INT16)sScrollXStep, (INT16)sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground( SCROLL_DOWNRIGHT, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fDownOK )
- {
- FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground( SCROLL_DOWN, sScrollXStep, sScrollYStep );
- }
- }
- else if ( fRightOK )
- {
- FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
- sTempRenderCenterX = gsRenderCenterX + sTempX_W;
- sTempRenderCenterY = gsRenderCenterY + sTempY_W;
- fAGoodMove = TRUE;
- if ( !fCheckOnly )
- {
- ScrollBackground( SCROLL_RIGHT, sScrollXStep, sScrollYStep );
- }
- }
- }
- ( *psTempRenderCenterX ) = sTempRenderCenterX;
- ( *psTempRenderCenterY ) = sTempRenderCenterY;
- return( fAGoodMove );
- }
- void ScrollWorld( )
- {
- UINT32 ScrollFlags = 0;
- BOOLEAN fDoScroll = FALSE, fMovedPos=FALSE, fAGoodMove = FALSE;
- INT16 sTempRenderCenterX, sTempRenderCenterY;
- INT8 bDirection;
- INT16 sScrollXStep=-1;
- INT16 sScrollYStep=-1;
- BOOLEAN fIgnoreInput = FALSE;
- static UINT8 ubOldScrollSpeed = 0;
- static BOOLEAN fFirstTimeInSlideToMode = TRUE;
- if ( gfIgnoreScrollDueToCenterAdjust )
- {
- // gfIgnoreScrollDueToCenterAdjust = FALSE;
- return;
- }
- if ( gfIgnoreScrolling == 1 )
- {
- return;
- }
- if ( gfIgnoreScrolling == 2 )
- {
- fIgnoreInput = TRUE;
- }
- if ( gCurrentUIMode == LOCKUI_MODE )
- {
- fIgnoreInput = TRUE;
- }
- // If in editor, ignore scrolling if any of the shift keys pressed with arrow keys
- if ( gfEditMode && ( _KeyDown(CTRL) || _KeyDown(ALT) ) )
- return;
- // Ignore if ALT DONW
- if ( _KeyDown( ALT ) )
- return;
- do
- {
- if ( gfIgnoreScrolling != 3 )
- {
- // Check for sliding
- if ( gTacticalStatus.sSlideTarget != NOWHERE )
- {
- // Ignore all input...
- // Check if we have reached out dest!
- if ( fFirstTimeInSlideToMode )
- {
- ubOldScrollSpeed = gubCurScrollSpeedID;
- fFirstTimeInSlideToMode = FALSE;
- }
- // Make faster!
- //gubCurScrollSpeedID = 2;
- ScrollFlags = 0;
- fDoScroll = FALSE;
- //
- if ( SoldierLocationRelativeToScreen( gTacticalStatus.sSlideTarget, gTacticalStatus.sSlideReason, &bDirection, &ScrollFlags ) && GridNoOnVisibleWorldTile( gTacticalStatus.sSlideTarget ) )
- {
- ScrollFlags = gScrollDirectionFlags[ bDirection ];
- fDoScroll = TRUE;
- fIgnoreInput = TRUE;
- }
- else
- {
- // We've stopped!
- gTacticalStatus.sSlideTarget = NOWHERE;
- }
- }
- else
- {
- // Restore old scroll speed
- if ( !fFirstTimeInSlideToMode )
- {
- gubCurScrollSpeedID = ubOldScrollSpeed;
- }
- fFirstTimeInSlideToMode = TRUE;
- }
- }
- if ( !fIgnoreInput )
- {
- // Check keys
- if ( _KeyDown( UPARROW ) )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_UP;
- }
-
- if ( _KeyDown( DNARROW ) )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_DOWN;
- }
- if ( _KeyDown( RIGHTARROW ) )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_RIGHT;
- }
- if ( _KeyDown( LEFTARROW ) )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_LEFT;
- }
-
- // Do mouse - PUT INTO A TIMER!
- // Put a counter on starting from mouse, if we have not started already!
- if ( !gfScrollInertia && gfScrollPending == FALSE )
- {
- if ( !COUNTERDONE( STARTSCROLL ) )
- {
- break;
- }
- RESETCOUNTER( STARTSCROLL );
- }
- if ( gusMouseYPos == 0 )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_UP;
- }
-
- if ( gusMouseYPos >= 479 )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_DOWN;
- }
- if ( gusMouseXPos >= 639 )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_RIGHT;
- }
- if ( gusMouseXPos == 0 )
- {
- fDoScroll = TRUE;
- ScrollFlags |= SCROLL_LEFT;
- }
- }
- } while( FALSE );
- if ( fDoScroll )
- {
- if ( gfDoSubtileScroll )
- {
- if ( gfScrollInertia > gubNewScrollIDSpeeds[ gubCurScrollSpeedID ] )
- {
- gubCurScrollSpeedID++;
- if ( gubCurScrollSpeedID > gubScrollSpeedEndID )
- {
- gubCurScrollSpeedID = gubScrollSpeedEndID;
- }
- }
- }
- //if ( !gfDoVideoScroll )
- //{
- // gubCurScrollSpeedID = 4;
- //}
- // Adjust speed based on whether shift is down
- if ( _KeyDown( SHIFT ) )
- {
- sScrollXStep = gubNewScrollXSpeeds[ gfDoVideoScroll ][ 3 ];
- sScrollYStep = gubNewScrollYSpeeds[ gfDoVideoScroll ][ 3 ];
- }
- else
- {
- sScrollXStep = gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
- sScrollYStep = gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
- }
- // Set diagonal flags!
- if ( ( ScrollFlags & SCROLL_LEFT ) && ( ScrollFlags & SCROLL_UP ) )
- {
- ScrollFlags = SCROLL_UPLEFT;
- }
- if ( ( ScrollFlags & SCROLL_RIGHT ) && ( ScrollFlags & SCROLL_UP ) )
- {
- ScrollFlags = SCROLL_UPRIGHT;
- }
- if ( ( ScrollFlags & SCROLL_LEFT ) && ( ScrollFlags & SCROLL_DOWN ) )
- {
- ScrollFlags = SCROLL_DOWNLEFT;
- }
- if ( ( ScrollFlags & SCROLL_RIGHT ) && ( ScrollFlags & SCROLL_DOWN ) )
- {
- ScrollFlags = SCROLL_DOWNRIGHT;
- }
- fAGoodMove = HandleScrollDirections( ScrollFlags, sScrollXStep, sScrollYStep, &sTempRenderCenterX, &sTempRenderCenterY, TRUE );
- }
- // Has this been an OK scroll?
- if ( fAGoodMove )
- {
- if ( COUNTERDONE( NEXTSCROLL ) )
- {
- RESETCOUNTER( NEXTSCROLL );
- // Are we starting a new scroll?
- if ( gfScrollInertia == 0 && gfScrollPending == FALSE )
- {
- // We are starting to scroll - setup scroll pending
- gfScrollPending = TRUE;
- // Remove any interface stuff
- ClearInterface( );
- // Return so that next frame things will be erased!
- return;
- }
- // If here, set scroll pending to false
- gfScrollPending = FALSE;
- // INcrement scroll intertia
- gfScrollInertia++;
- // Now we actually begin our scrolling
- HandleScrollDirections( ScrollFlags, sScrollXStep, sScrollYStep, &sTempRenderCenterX, &sTempRenderCenterY, FALSE );
- }
- }
- else
- {
- // ATE: Also if scroll pending never got to scroll....
- if ( gfScrollPending == TRUE )
- {
- // Do a complete rebuild!
- gfScrollPending = FALSE;
- // Restore Interface!
- RestoreInterface( );
- // Delete Topmost blitters saved areas
- DeleteVideoOverlaysArea( );
- }
- // Check if we have just stopped scrolling!
- if ( gfScrollInertia != FALSE )
- {
- SetRenderFlags( RENDER_FLAG_FULL | RENDER_FLAG_CHECKZ );
- // Restore Interface!
- RestoreInterface( );
- // Delete Topmost blitters saved areas
- DeleteVideoOverlaysArea( );
- }
- gfScrollInertia = FALSE;
- gfScrollPending = FALSE;
-
- if ( gfDoSubtileScroll )
- {
- gubCurScrollSpeedID = gubScrollSpeedStartID;
- }
- }
- }
- void InitRenderParams( UINT8 ubRestrictionID )
- {
- INT16 gsTilesX, gsTilesY;
- UINT32 cnt, cnt2;
- DOUBLE dWorldX, dWorldY;
- switch( ubRestrictionID )
- {
- case 0: //Default!
- gTopLeftWorldLimitX = CELL_X_SIZE;
- gTopLeftWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
- gTopRightWorldLimitX = ( WORLD_COLS / 2 ) * CELL_Y_SIZE;
- gTopRightWorldLimitY = CELL_X_SIZE;
-
- gBottomLeftWorldLimitX = ( ( WORLD_COLS / 2 ) * CELL_Y_SIZE );
- gBottomLeftWorldLimitY = ( WORLD_ROWS * CELL_Y_SIZE );
- gBottomRightWorldLimitX = ( WORLD_COLS * CELL_Y_SIZE );
- gBottomRightWorldLimitY = ( ( WORLD_ROWS / 2 ) * CELL_X_SIZE );
- break;
- case 1: // BAEMENT LEVEL 1
- gTopLeftWorldLimitX = ( 3 * WORLD_ROWS / 10 ) * CELL_X_SIZE;
- gTopLeftWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
- gTopRightWorldLimitX = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
- gTopRightWorldLimitY = ( 3 * WORLD_COLS / 10 ) * CELL_X_SIZE;
-
- gBottomLeftWorldLimitX = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
- gBottomLeftWorldLimitY = ( 7 * WORLD_COLS / 10 ) * CELL_X_SIZE;
- gBottomRightWorldLimitX = ( 7 * WORLD_ROWS / 10 ) * CELL_X_SIZE;
- gBottomRightWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
- break;
- }
- gCenterWorldX = ( WORLD_ROWS ) / 2 * CELL_X_SIZE;
- gCenterWorldY = ( WORLD_COLS ) / 2 * CELL_Y_SIZE;
- // Convert Bounding box into screen coords
- FromCellToScreenCoordinates( gTopLeftWorldLimitX, gTopLeftWorldLimitY, &gsTLX, &gsTLY );
- FromCellToScreenCoordinates( gTopRightWorldLimitX, gTopRightWorldLimitY, &gsTRX, &gsTRY );
- FromCellToScreenCoordinates( gBottomLeftWorldLimitX, gBottomLeftWorldLimitY, &gsBLX, &gsBLY );
- FromCellToScreenCoordinates( gBottomRightWorldLimitX, gBottomRightWorldLimitY, &gsBRX, &gsBRY );
- FromCellToScreenCoordinates( gCenterWorldX , gCenterWorldY, &gsCX, &gsCY );
- // Adjust for interface height tabbing!
- gsTLY += ROOF_LEVEL_HEIGHT;
- gsTRY += ROOF_LEVEL_HEIGHT;
- gsCY += ( ROOF_LEVEL_HEIGHT / 2 );
- // Take these spaning distances and determine # tiles spaning
- gsTilesX = ( gsTRX - gsTLX ) / WORLD_TILE_X;
- gsTilesY = ( gsBRY - gsTRY ) / WORLD_TILE_Y;
-
- DebugMsg(TOPIC_JA2, DBG_LEVEL_0, String("World Screen Width %d Height %d", ( gsTRX - gsTLX ), ( gsBRY - gsTRY )));
- // Determine scale factors
- // First scale world screen coords for VIEWPORT ratio
- dWorldX = (DOUBLE)( gsTRX - gsTLX );
- dWorldY = (DOUBLE)( gsBRY - gsTRY );
- gdScaleX = (DOUBLE)RADAR_WINDOW_WIDTH / dWorldX;
- gdScaleY = (DOUBLE)RADAR_WINDOW_HEIGHT / dWorldY;
- for ( cnt = 0, cnt2 = 0; cnt2 < NUM_ITEM_CYCLE_COLORS; cnt+=3, cnt2++ )
- {
- us16BPPItemCycleWhiteColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleWhiteColors[ cnt ], ubRGBItemCycleWhiteColors[ cnt + 1 ], ubRGBItemCycleWhiteColors[ cnt + 2] ) );
- us16BPPItemCycleRedColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleRedColors[ cnt ], ubRGBItemCycleRedColors[ cnt + 1 ], ubRGBItemCycleRedColors[ cnt + 2] ) );
- us16BPPItemCycleYellowColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleYellowColors[ cnt ], ubRGBItemCycleYellowColors[ cnt + 1 ], ubRGBItemCycleYellowColors[ cnt + 2] ) );
- }
- gsLobOutline = Get16BPPColor( FROMRGB( 10, 200, 10 ) );
- gsThrowOutline = Get16BPPColor( FROMRGB( 253, 212, 10 ) );
- gsGiveOutline = Get16BPPColor( FROMRGB( 253, 0, 0 ) );
- gusNormalItemOutlineColor = Get16BPPColor( FROMRGB( 255, 255, 255 ) );
- gusYellowItemOutlineColor = Get16BPPColor( FROMRGB( 255, 255, 0 ) );
- // NOW GET DISTANCE SPANNING WORLD LIMITS IN WORLD COORDS
- //FromScreenToCellCoordinates( ( gTopRightWorldLimitX - gTopLeftWorldLimitX ), ( gTopRightWorldLimitY - gTopLeftWorldLimitY ), &gsWorldSpanX, &gsWorldSpanY );
-
- // CALCULATE 16BPP COLORS FOR ITEMS
- }
- // Appy? HEahehahehahehae.....
- BOOLEAN ApplyScrolling( INT16 sTempRenderCenterX, INT16 sTempRenderCenterY, BOOLEAN fForceAdjust, BOOLEAN fCheckOnly )
- {
- BOOLEAN fScrollGood = FALSE;
- BOOLEAN fOutLeft = FALSE;
- BOOLEAN fOutRight = FALSE;
- BOOLEAN fOutTop = FALSE;
- BOOLEAN fOutBottom = FALSE;
- double dOpp, dAdj, dAngle;
- INT16 sTopLeftWorldX, sTopLeftWorldY;
- INT16 sTopRightWorldX, sTopRightWorldY;
- INT16 sBottomLeftWorldX, sBottomLeftWorldY;
- INT16 sBottomRightWorldX, sBottomRightWorldY;
- INT16 sTempPosX_W, sTempPosY_W;
- // For debug text for all 4 angles
- double at1, at2, at3, at4;
- INT16 sX_S, sY_S;
- INT16 sScreenCenterX, sScreenCenterY;
- INT16 sDistToCenterY, sDistToCenterX;
- INT16 sNewScreenX, sNewScreenY;
- INT16 sMult;
- //Makesure it's a multiple of 5
- sMult = sTempRenderCenterX / CELL_X_SIZE;
- sTempRenderCenterX = ( sMult * CELL_X_SIZE ) + ( CELL_X_SIZE / 2 );
- //Makesure it's a multiple of 5
- sMult = sTempRenderCenterY / CELL_X_SIZE;
- sTempRenderCenterY = ( sMult * CELL_Y_SIZE ) + ( CELL_Y_SIZE / 2 );
-
- // Find the diustance from render center to true world center
- sDistToCenterX = sTempRenderCenterX - gCenterWorldX;
- sDistToCenterY = sTempRenderCenterY - gCenterWorldY;
-
- // From render center in world coords, convert to render center in "screen" coords
- FromCellToScreenCoordinates( sDistToCenterX , sDistToCenterY, &sScreenCenterX, &sScreenCenterY );
- // Subtract screen center
- sScreenCenterX += gsCX;
- sScreenCenterY += gsCY;
-
- // Adjust for offset position on screen
- sScreenCenterX -= 0;
- sScreenCenterY -= 10;
- // Get corners in screen coords
- // TOP LEFT
- sX_S = ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2;
- sY_S = ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2;
- sTopLeftWorldX = sScreenCenterX - sX_S;
- sTopLeftWorldY = sScreenCenterY - sY_S;
- sTopRightWorldX = sScreenCenterX + sX_S;
- sTopRightWorldY = sScreenCenterY - sY_S;
-
- sBottomLeftWorldX = sScreenCenterX - sX_S;
- sBottomLeftWorldY = sScreenCenterY + sY_S;
- sBottomRightWorldX = sScreenCenterX + sX_S;
- sBottomRightWorldY = sScreenCenterY + sY_S;
- // Get angles
- // TOP LEFT CORNER FIRST
- dOpp = sTopLeftWorldY - gsTLY;
- dAdj = sTopLeftWorldX - gsTLX;
- dAngle = (double)atan2( dAdj, dOpp );
- at1 = dAngle * 180 / PI;
- if ( dAngle < 0 )
- {
- fOutLeft = TRUE;
- }
- else if ( dAngle > PI/2 )
- {
- fOutTop = TRUE;
- }
- // TOP RIGHT CORNER
- dOpp = sTopRightWorldY - gsTRY;
- dAdj = gsTRX - sTopRightWorldX;
- dAngle = (double)atan2( dAdj, dOpp );
- at2 = dAngle * 180 / PI;
- if ( dAngle < 0 )
- {
- fOutRight = TRUE;
- }
- else if ( dAngle > PI/2 )
- {
- fOutTop = TRUE;
- }
- // BOTTOM LEFT CORNER
- dOpp = gsBLY - sBottomLeftWorldY;
- dAdj = sBottomLeftWorldX - gsBLX;
- dAngle = (double)atan2( dAdj, dOpp );
- at3 = dAngle * 180 / PI;
- if ( dAngle < 0 )
- {
- fOutLeft = TRUE;
- }
- else if ( dAngle > PI/2 )
- {
- fOutBottom = TRUE;
- }
- // BOTTOM RIGHT CORNER
- dOpp = gsBRY - sBottomRightWorldY;
- dAdj = gsBRX - sBottomRightWorldX;
- dAngle = (double)atan2( dAdj, dOpp );
- at4 = dAngle * 180 / PI;
- if ( dAngle < 0 )
- {
- fOutRight = TRUE;
- }
- else if ( dAngle > PI/2 )
- {
- fOutBottom = TRUE;
- }
- sprintf( gDebugStr, "Angles: %d %d %d %d", (int)at1, (int)at2, (int)at3, (int)at4 );
- if ( !fOutRight && !fOutLeft && !fOutTop && !fOutBottom )
- {
- fScrollGood = TRUE;
- }
- // If in editor, anything goes
- if ( gfEditMode && _KeyDown( SHIFT ) )
- {
- fScrollGood = TRUE;
- }
- // Reset some UI flags
- gfUIShowExitEast = FALSE;
- gfUIShowExitWest = FALSE;
- gfUIShowExitNorth = FALSE;
- gfUIShowExitSouth = FALSE;
- if ( !fScrollGood )
- {
- // Force adjustment, if true
- if ( fForceAdjust )
- {
- if ( fOutTop )
- {
- // Adjust screen coordinates on the Y!
- CorrectRenderCenter( sScreenCenterX, (INT16)(gsTLY + sY_S ), &sNewScreenX, &sNewScreenY );
- FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
- sTempRenderCenterX = sTempPosX_W;
- sTempRenderCenterY = sTempPosY_W;
- fScrollGood = TRUE;
- }
- if ( fOutBottom )
- {
- // OK, Ajust this since we get rounding errors in our two different calculations.
- CorrectRenderCenter( sScreenCenterX, (INT16)(gsBLY - sY_S - 50 ), &sNewScreenX, &sNewScreenY );
- FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
- sTempRenderCenterX = sTempPosX_W;
- sTempRenderCenterY = sTempPosY_W;
- fScrollGood = TRUE;
- }
-
- if ( fOutLeft )
- {
- CorrectRenderCenter( (INT16)( gsTLX + sX_S ) , sScreenCenterY , &sNewScreenX, &sNewScreenY );
- FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
- sTempRenderCenterX = sTempPosX_W;
- sTempRenderCenterY = sTempPosY_W;
- fScrollGood = TRUE;
- }
- if ( fOutRight )
- {
- CorrectRenderCenter( (INT16)( gsTRX - sX_S ) , sScreenCenterY , &sNewScreenX, &sNewScreenY );
- FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
- sTempRenderCenterX = sTempPosX_W;
- sTempRenderCenterY = sTempPosY_W;
- fScrollGood = TRUE;
- }
- }
- else
- {
- if ( fOutRight )
- {
- // Check where our cursor is!
- if ( gusMouseXPos >= 639 )
- {
- gfUIShowExitEast = TRUE;
- }
- }
- if ( fOutLeft )
- {
- // Check where our cursor is!
- if ( gusMouseXPos == 0 )
- {
- gfUIShowExitWest = TRUE;
- }
- }
- if ( fOutTop )
- {
- // Check where our cursor is!
- if ( gusMouseYPos == 0 )
- {
- gfUIShowExitNorth = TRUE;
- }
- }
- if ( fOutBottom )
- {
- // Check where our cursor is!
- if ( gusMouseYPos >= 479 )
- {
- gfUIShowExitSouth = TRUE;
- }
- }
- }
- }
- if ( fScrollGood )
- {
- if ( !fCheckOnly )
- {
- sprintf( gDebugStr, "Center: %d %d ", (int)gsRenderCenterX, (int)gsRenderCenterY );
- //Makesure it's a multiple of 5
- sMult = sTempRenderCenterX / CELL_X_SIZE;
- gsRenderCenterX = ( sMult * CELL_X_SIZE ) + ( CELL_X_SIZE / 2 );
- //Makesure it's a multiple of 5
- sMult = sTempRenderCenterY / CELL_X_SIZE;
- gsRenderCenterY = ( sMult * CELL_Y_SIZE ) + ( CELL_Y_SIZE / 2 );
- //gsRenderCenterX = sTempRenderCenterX;
- //gsRenderCenterY = sTempRenderCenterY;
- gsTopLeftWorldX = sTopLeftWorldX - gsTLX;
- gsTopLeftWorldY = sTopLeftWorldY - gsTLY;
- gsTopRightWorldX = sTopRightWorldX - gsTLX;
- gsTopRightWorldY = sTopRightWorldY - gsTLY;
-
- gsBottomLeftWorldX = sBottomLeftWorldX - gsTLX;
- gsBottomLeftWorldY = sBottomLeftWorldY - gsTLY;
- gsBottomRightWorldX = sBottomRightWorldX - gsTLX;
- gsBottomRightWorldY = sBottomRightWorldY - gsTLY;
- SetPositionSndsVolumeAndPanning( );
- }
- return( TRUE );
- }
- return( FALSE );
- }
- void ClearMarkedTiles(void)
- {
- UINT32 uiCount;
- for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
- gpWorldLevelData[uiCount].uiFlags&=(~MAPELEMENT_REDRAW);
- }
- // @@ATECLIP TO WORLD!
- void InvalidateWorldRedundencyRadius(INT16 sX, INT16 sY, INT16 sRadius)
- {
- INT16 sCountX, sCountY;
- UINT32 uiTile;
- SetRenderFlags( RENDER_FLAG_CHECKZ );
- for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
- {
- for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
- {
- uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
- gpWorldLevelData[uiTile].uiFlags |= MAPELEMENT_REEVALUATE_REDUNDENCY;
- }
- }
- }
- void InvalidateWorldRedundency( )
- {
- UINT32 uiCount;
-
- SetRenderFlags( RENDER_FLAG_CHECKZ );
- for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
- gpWorldLevelData[uiCount].uiFlags |= MAPELEMENT_REEVALUATE_REDUNDENCY;
- }
- #define Z_STRIP_DELTA_Y ( Z_SUBLAYERS * 10 )
- /**********************************************************************************************
- Blt8BPPDataTo16BPPBufferTransZIncClip
- Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
- buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
- pixel's Z level is below that of the current pixel, it is written on, and the Z value is
- updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
- must be the same dimensions (including Pitch) as the destination.
- **********************************************************************************************/
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
- {
- UINT16 *p16BPPPalette;
- UINT32 uiOffset;
- UINT32 usHeight, usWidth, Unblitted;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
- INT32 ClipX1, ClipY1, ClipX2, ClipY2;
- UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
- INT8 *pZArray;
- ZStripInfo *pZInfo;
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- if(clipregion==NULL)
- {
- ClipX1=ClippingRect.iLeft;
- ClipY1=ClippingRect.iTop;
- ClipX2=ClippingRect.iRight;
- ClipY2=ClippingRect.iBottom;
- }
- else
- {
- ClipX1=clipregion->iLeft;
- ClipY1=clipregion->iTop;
- ClipX2=clipregion->iRight;
- ClipY2=clipregion->iBottom;
- }
- // Calculate rows hanging off each side of the screen
- LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
- RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
- TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
- BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
-
- // calculate the remaining rows and columns to blit
- BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
- BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
- // check if whole thing is clipped
- if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
- return(TRUE);
- // check if whole thing is clipped
- if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
- return(TRUE);
-
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- p16BPPPalette = hSrcVObject->pShadeCurrent;
- LineSkip=(uiDestPitchBYTES-(BlitLength*2));
- if(hSrcVObject->ppZStripInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- // setup for the z-column blitting stuff
- pZInfo=hSrcVObject->ppZStripInfo[usIndex];
- if(pZInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
- // set to odd number of pixels for first column
-
- if(LeftSkip > pZInfo->ubFirstZStripWidth)
- {
- usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
- usZStartCols=20-(usZStartCols%20);
- }
- else if(LeftSkip < pZInfo->ubFirstZStripWidth)
- usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
- else
- usZStartCols=20;
- usZColsToGo=usZStartCols;
- pZArray=pZInfo->pbZChange;
- if(LeftSkip >= pZInfo->ubFirstZStripWidth)
- {
- // Index into array after doing left clipping
- usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
- //calculates the Z-value after left-side clipping
- if(usZStartIndex)
- {
- for(usCount=0; usCount < usZStartIndex; usCount++)
- {
- switch(pZArray[usCount])
- {
- case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
- break;
- case 0: //no change
- break;
- case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
- break;
- }
- }
- }
- }
- else
- usZStartIndex=0;
- usZLevel=usZStartLevel;
- usZIndex=usZStartIndex;
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- cmp TopSkip, 0 // check for nothing clipped on top
- je LeftSkipSetup
- // Skips the number of lines clipped at the top
- TopSkipLoop:
-
- mov cl, [esi]
- inc esi
- or cl, cl
- js TopSkipLoop
- jz TSEndLine
- add esi, ecx
- jmp TopSkipLoop
- TSEndLine:
- dec TopSkip
- jnz TopSkipLoop
- // Start of line loop
- // Skips the pixels hanging outside the left-side boundry
- LeftSkipSetup:
-
- mov Unblitted, 0 // Unblitted counts any pixels left from a run
- mov eax, LeftSkip // after we have skipped enough left-side pixels
- mov LSCount, eax // LSCount counts how many pixels skipped so far
- or eax, eax
- jz BlitLineSetup // check for nothing to skip
- LeftSkipLoop:
- mov cl, [esi]
- inc esi
- or cl, cl
- js LSTrans
- cmp ecx, LSCount
- je LSSkip2 // if equal, skip whole, and start blit with new run
- jb LSSkip1 // if less, skip whole thing
- add esi, LSCount // skip partial run, jump into normal loop for rest
- sub ecx, LSCount
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitNTL1 // *** jumps into non-transparent blit loop
-
- LSSkip2:
- add esi, ecx // skip whole run, and start blit with new run
- jmp BlitLineSetup
- LSSkip1:
- add esi, ecx // skip whole run, continue skipping
- sub LSCount, ecx
- jmp LeftSkipLoop
- LSTrans:
- and ecx, 07fH
- cmp ecx, LSCount
- je BlitLineSetup // if equal, skip whole, and start blit with new run
- jb LSTrans1 // if less, skip whole thing
- sub ecx, LSCount // skip partial run, jump into normal loop for rest
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitTransparent // *** jumps into transparent blit loop
-
- LSTrans1:
- sub LSCount, ecx // skip whole run, continue skipping
- jmp LeftSkipLoop
- //-------------------------------------------------
- // setup for beginning of line
- BlitLineSetup:
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- BlitDispatch:
- cmp LSCount, 0 // Check to see if we're done blitting
- je RightSkipLoop
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz RSLoop2
-
- //--------------------------------
- // blitting non-transparent pixels
- and ecx, 07fH
- BlitNTL1:
- mov ax, [ebx] // check z-level of pixel
- cmp ax, usZLevel
- jae BlitNTL2
- mov ax, usZLevel // update z-level of pixel
- mov [ebx], ax
- xor eax, eax
- mov al, [esi] // copy pixel
- mov ax, [edx+eax*2]
- mov [edi], ax
- BlitNTL2:
- inc esi
- add edi, 2
- add ebx, 2
- dec usZColsToGo
- jnz BlitNTL6
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitNTL5 // dir = 0 no change
- js BlitNTL4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitNTL5
- BlitNTL4:
- sub dx, Z_STRIP_DELTA_Y
- BlitNTL5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitNTL6:
- dec LSCount // decrement pixel length to blit
- jz RightSkipLoop // done blitting the visible line
-
- dec ecx
- jnz BlitNTL1 // continue current run
-
- jmp BlitDispatch // done current run, go for another
- //----------------------------
- // skipping transparent pixels
- BlitTransparent: // skip transparent pixels
- and ecx, 07fH
- BlitTrans2:
- add edi, 2 // move up the destination pointer
- add ebx, 2
-
- dec usZColsToGo
- jnz BlitTrans1
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitTrans5 // dir = 0 no change
- js BlitTrans4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitTrans5
- BlitTrans4:
- sub dx, Z_STRIP_DELTA_Y
- BlitTrans5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitTrans1:
- dec LSCount // decrement the pixels to blit
- jz RightSkipLoop // done the line
- dec ecx
- jnz BlitTrans2
- jmp BlitDispatch
- //---------------------------------------------
- // Scans the ETRLE until it finds an EOL marker
- RightSkipLoop:
-
-
- RSLoop1:
- mov al, [esi]
- inc esi
- or al, al
- jnz RSLoop1
- RSLoop2:
- dec BlitHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- // reset all the z-level stuff for a new line
- mov ax, usZStartLevel
- mov usZLevel, ax
- mov ax, usZStartIndex
- mov usZIndex, ax
- mov ax, usZStartCols
- mov usZColsToGo, ax
-
- jmp LeftSkipSetup
-
- BlitDone:
- }
- return(TRUE);
- }
- /**********************************************************************************************
- Blt8BPPDataTo16BPPBufferTransZIncClipSaveZBurnsThrough
- Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
- buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
- pixel's Z level is below that of the current pixel, it is written on, and the Z value is
- updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
- must be the same dimensions (including Pitch) as the destination.
- **********************************************************************************************/
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
- {
- UINT16 *p16BPPPalette;
- UINT32 uiOffset;
- UINT32 usHeight, usWidth, Unblitted;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
- INT32 ClipX1, ClipY1, ClipX2, ClipY2;
- UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
- INT8 *pZArray;
- ZStripInfo *pZInfo;
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- if(clipregion==NULL)
- {
- ClipX1=ClippingRect.iLeft;
- ClipY1=ClippingRect.iTop;
- ClipX2=ClippingRect.iRight;
- ClipY2=ClippingRect.iBottom;
- }
- else
- {
- ClipX1=clipregion->iLeft;
- ClipY1=clipregion->iTop;
- ClipX2=clipregion->iRight;
- ClipY2=clipregion->iBottom;
- }
- // Calculate rows hanging off each side of the screen
- LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
- RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
- TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
- BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
-
- // calculate the remaining rows and columns to blit
- BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
- BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
- // check if whole thing is clipped
- if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
- return(TRUE);
- // check if whole thing is clipped
- if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
- return(TRUE);
-
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- p16BPPPalette = hSrcVObject->pShadeCurrent;
- LineSkip=(uiDestPitchBYTES-(BlitLength*2));
- if(hSrcVObject->ppZStripInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- // setup for the z-column blitting stuff
- pZInfo=hSrcVObject->ppZStripInfo[usIndex];
- if(pZInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
- // set to odd number of pixels for first column
-
- if(LeftSkip > pZInfo->ubFirstZStripWidth)
- {
- usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
- usZStartCols=20-(usZStartCols%20);
- }
- else if(LeftSkip < pZInfo->ubFirstZStripWidth)
- usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
- else
- usZStartCols=20;
- usZColsToGo=usZStartCols;
- pZArray=pZInfo->pbZChange;
- if(LeftSkip >= pZInfo->ubFirstZStripWidth)
- {
- // Index into array after doing left clipping
- usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
- //calculates the Z-value after left-side clipping
- if(usZStartIndex)
- {
- for(usCount=0; usCount < usZStartIndex; usCount++)
- {
- switch(pZArray[usCount])
- {
- case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
- break;
- case 0: //no change
- break;
- case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
- break;
- }
- }
- }
- }
- else
- usZStartIndex=0;
- usZLevel=usZStartLevel;
- usZIndex=usZStartIndex;
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- cmp TopSkip, 0 // check for nothing clipped on top
- je LeftSkipSetup
- // Skips the number of lines clipped at the top
- TopSkipLoop:
-
- mov cl, [esi]
- inc esi
- or cl, cl
- js TopSkipLoop
- jz TSEndLine
- add esi, ecx
- jmp TopSkipLoop
- TSEndLine:
- dec TopSkip
- jnz TopSkipLoop
- // Start of line loop
- // Skips the pixels hanging outside the left-side boundry
- LeftSkipSetup:
-
- mov Unblitted, 0 // Unblitted counts any pixels left from a run
- mov eax, LeftSkip // after we have skipped enough left-side pixels
- mov LSCount, eax // LSCount counts how many pixels skipped so far
- or eax, eax
- jz BlitLineSetup // check for nothing to skip
- LeftSkipLoop:
- mov cl, [esi]
- inc esi
- or cl, cl
- js LSTrans
- cmp ecx, LSCount
- je LSSkip2 // if equal, skip whole, and start blit with new run
- jb LSSkip1 // if less, skip whole thing
- add esi, LSCount // skip partial run, jump into normal loop for rest
- sub ecx, LSCount
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitNTL1 // *** jumps into non-transparent blit loop
-
- LSSkip2:
- add esi, ecx // skip whole run, and start blit with new run
- jmp BlitLineSetup
- LSSkip1:
- add esi, ecx // skip whole run, continue skipping
- sub LSCount, ecx
- jmp LeftSkipLoop
- LSTrans:
- and ecx, 07fH
- cmp ecx, LSCount
- je BlitLineSetup // if equal, skip whole, and start blit with new run
- jb LSTrans1 // if less, skip whole thing
- sub ecx, LSCount // skip partial run, jump into normal loop for rest
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitTransparent // *** jumps into transparent blit loop
-
- LSTrans1:
- sub LSCount, ecx // skip whole run, continue skipping
- jmp LeftSkipLoop
- //-------------------------------------------------
- // setup for beginning of line
- BlitLineSetup:
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- BlitDispatch:
- cmp LSCount, 0 // Check to see if we're done blitting
- je RightSkipLoop
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz RSLoop2
-
- //--------------------------------
- // blitting non-transparent pixels
- and ecx, 07fH
- BlitNTL1:
- mov ax, [ebx] // check z-level of pixel
- cmp ax, usZLevel
- ja BlitNTL2
- mov ax, usZLevel // update z-level of pixel
- mov [ebx], ax
- xor eax, eax
- mov al, [esi] // copy pixel
- mov ax, [edx+eax*2]
- mov [edi], ax
- BlitNTL2:
- inc esi
- add edi, 2
- add ebx, 2
- dec usZColsToGo
- jnz BlitNTL6
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitNTL5 // dir = 0 no change
- js BlitNTL4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitNTL5
- BlitNTL4:
- sub dx, Z_STRIP_DELTA_Y
- BlitNTL5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitNTL6:
- dec LSCount // decrement pixel length to blit
- jz RightSkipLoop // done blitting the visible line
-
- dec ecx
- jnz BlitNTL1 // continue current run
-
- jmp BlitDispatch // done current run, go for another
- //----------------------------
- // skipping transparent pixels
- BlitTransparent: // skip transparent pixels
- and ecx, 07fH
- BlitTrans2:
- add edi, 2 // move up the destination pointer
- add ebx, 2
-
- dec usZColsToGo
- jnz BlitTrans1
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitTrans5 // dir = 0 no change
- js BlitTrans4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitTrans5
- BlitTrans4:
- sub dx, Z_STRIP_DELTA_Y
- BlitTrans5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitTrans1:
- dec LSCount // decrement the pixels to blit
- jz RightSkipLoop // done the line
- dec ecx
- jnz BlitTrans2
- jmp BlitDispatch
- //---------------------------------------------
- // Scans the ETRLE until it finds an EOL marker
- RightSkipLoop:
-
-
- RSLoop1:
- mov al, [esi]
- inc esi
- or al, al
- jnz RSLoop1
- RSLoop2:
- dec BlitHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- // reset all the z-level stuff for a new line
- mov ax, usZStartLevel
- mov usZLevel, ax
- mov ax, usZStartIndex
- mov usZIndex, ax
- mov ax, usZStartCols
- mov usZColsToGo, ax
-
- jmp LeftSkipSetup
-
- BlitDone:
- }
- return(TRUE);
- }
- /**********************************************************************************************
- Blt8BPPDataTo16BPPBufferTransZIncObscureClip
- Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
- buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
- pixel's Z level is below that of the current pixel, it is written on, and the Z value is
- updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
- must be the same dimensions (including Pitch) as the destination.
- //ATE: This blitter makes the values that are =< z value pixellate rather than not
- // render at all
- **********************************************************************************************/
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
- {
- UINT16 *p16BPPPalette;
- UINT32 uiOffset, uiLineFlag;
- UINT32 usHeight, usWidth, Unblitted;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
- INT32 ClipX1, ClipY1, ClipX2, ClipY2;
- UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
- INT8 *pZArray;
- ZStripInfo *pZInfo;
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- if(clipregion==NULL)
- {
- ClipX1=ClippingRect.iLeft;
- ClipY1=ClippingRect.iTop;
- ClipX2=ClippingRect.iRight;
- ClipY2=ClippingRect.iBottom;
- }
- else
- {
- ClipX1=clipregion->iLeft;
- ClipY1=clipregion->iTop;
- ClipX2=clipregion->iRight;
- ClipY2=clipregion->iBottom;
- }
- // Calculate rows hanging off each side of the screen
- LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
- RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
- TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
- BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
-
- uiLineFlag=(iTempY&1);
- // calculate the remaining rows and columns to blit
- BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
- BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
- // check if whole thing is clipped
- if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
- return(TRUE);
- // check if whole thing is clipped
- if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
- return(TRUE);
-
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- p16BPPPalette = hSrcVObject->pShadeCurrent;
- LineSkip=(uiDestPitchBYTES-(BlitLength*2));
- if(hSrcVObject->ppZStripInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- // setup for the z-column blitting stuff
- pZInfo=hSrcVObject->ppZStripInfo[usIndex];
- if(pZInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
- // set to odd number of pixels for first column
-
- if(LeftSkip > pZInfo->ubFirstZStripWidth)
- {
- usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
- usZStartCols=20-(usZStartCols%20);
- }
- else if(LeftSkip < pZInfo->ubFirstZStripWidth)
- usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
- else
- usZStartCols=20;
- usZColsToGo=usZStartCols;
- pZArray=pZInfo->pbZChange;
- if(LeftSkip >= pZInfo->ubFirstZStripWidth)
- {
- // Index into array after doing left clipping
- usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
- //calculates the Z-value after left-side clipping
- if(usZStartIndex)
- {
- for(usCount=0; usCount < usZStartIndex; usCount++)
- {
- switch(pZArray[usCount])
- {
- case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
- break;
- case 0: //no change
- break;
- case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
- break;
- }
- }
- }
- }
- else
- usZStartIndex=0;
- usZLevel=usZStartLevel;
- usZIndex=usZStartIndex;
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- cmp TopSkip, 0 // check for nothing clipped on top
- je LeftSkipSetup
- // Skips the number of lines clipped at the top
- TopSkipLoop:
-
- mov cl, [esi]
- inc esi
- or cl, cl
- js TopSkipLoop
- jz TSEndLine
- add esi, ecx
- jmp TopSkipLoop
- TSEndLine:
- xor uiLineFlag, 1
- dec TopSkip
- jnz TopSkipLoop
- // Start of line loop
- // Skips the pixels hanging outside the left-side boundry
- LeftSkipSetup:
-
- mov Unblitted, 0 // Unblitted counts any pixels left from a run
- mov eax, LeftSkip // after we have skipped enough left-side pixels
- mov LSCount, eax // LSCount counts how many pixels skipped so far
- or eax, eax
- jz BlitLineSetup // check for nothing to skip
- LeftSkipLoop:
- mov cl, [esi]
- inc esi
- or cl, cl
- js LSTrans
- cmp ecx, LSCount
- je LSSkip2 // if equal, skip whole, and start blit with new run
- jb LSSkip1 // if less, skip whole thing
- add esi, LSCount // skip partial run, jump into normal loop for rest
- sub ecx, LSCount
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitNTL1 // *** jumps into non-transparent blit loop
-
- LSSkip2:
- add esi, ecx // skip whole run, and start blit with new run
- jmp BlitLineSetup
- LSSkip1:
- add esi, ecx // skip whole run, continue skipping
- sub LSCount, ecx
- jmp LeftSkipLoop
- LSTrans:
- and ecx, 07fH
- cmp ecx, LSCount
- je BlitLineSetup // if equal, skip whole, and start blit with new run
- jb LSTrans1 // if less, skip whole thing
- sub ecx, LSCount // skip partial run, jump into normal loop for rest
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitTransparent // *** jumps into transparent blit loop
-
- LSTrans1:
- sub LSCount, ecx // skip whole run, continue skipping
- jmp LeftSkipLoop
- //-------------------------------------------------
- // setup for beginning of line
- BlitLineSetup:
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- BlitDispatch:
- cmp LSCount, 0 // Check to see if we're done blitting
- je RightSkipLoop
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz RSLoop2
-
- //--------------------------------
- // blitting non-transparent pixels
- and ecx, 07fH
- BlitNTL1:
- mov ax, [ebx] // check z-level of pixel
- cmp ax, usZLevel
- jae BlitPixellate1
- jmp BlitPixel1
- BlitPixellate1:
- // OK, DO PIXELLATE SCHEME HERE!
- test uiLineFlag, 1
- jz BlitSkip1
- test edi, 2
- jz BlitNTL2
- jmp BlitPixel1
- BlitSkip1:
- test edi, 2
- jnz BlitNTL2
-
- BlitPixel1:
- mov ax, usZLevel // update z-level of pixel
- mov [ebx], ax
- xor eax, eax
- mov al, [esi] // copy pixel
- mov ax, [edx+eax*2]
- mov [edi], ax
- BlitNTL2:
- inc esi
- add edi, 2
- add ebx, 2
- dec usZColsToGo
- jnz BlitNTL6
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitNTL5 // dir = 0 no change
- js BlitNTL4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitNTL5
- BlitNTL4:
- sub dx, Z_STRIP_DELTA_Y
- BlitNTL5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitNTL6:
- dec LSCount // decrement pixel length to blit
- jz RightSkipLoop // done blitting the visible line
-
- dec ecx
- jnz BlitNTL1 // continue current run
-
- jmp BlitDispatch // done current run, go for another
- //----------------------------
- // skipping transparent pixels
- BlitTransparent: // skip transparent pixels
- and ecx, 07fH
- BlitTrans2:
- add edi, 2 // move up the destination pointer
- add ebx, 2
-
- dec usZColsToGo
- jnz BlitTrans1
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitTrans5 // dir = 0 no change
- js BlitTrans4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_STRIP_DELTA_Y
- jmp BlitTrans5
- BlitTrans4:
- sub dx, Z_STRIP_DELTA_Y
- BlitTrans5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitTrans1:
- dec LSCount // decrement the pixels to blit
- jz RightSkipLoop // done the line
- dec ecx
- jnz BlitTrans2
- jmp BlitDispatch
- //---------------------------------------------
- // Scans the ETRLE until it finds an EOL marker
- RightSkipLoop:
-
-
- RSLoop1:
- mov al, [esi]
- inc esi
- or al, al
- jnz RSLoop1
- RSLoop2:
- xor uiLineFlag, 1
- dec BlitHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- // reset all the z-level stuff for a new line
- mov ax, usZStartLevel
- mov usZLevel, ax
- mov ax, usZStartIndex
- mov usZIndex, ax
- mov ax, usZStartCols
- mov usZColsToGo, ax
-
- jmp LeftSkipSetup
-
- BlitDone:
- }
- return(TRUE);
- }
- // Blitter Specs
- // 1 ) 8 to 16 bpp
- // 2 ) strip z-blitter
- // 3 ) clipped
- // 4 ) trans shadow - if value is 254, makes a shadow
- //
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette )
- {
- UINT32 uiOffset, uiLineFlag;
- UINT32 usHeight, usWidth, Unblitted;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
- INT32 ClipX1, ClipY1, ClipX2, ClipY2;
- UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
- INT8 *pZArray;
- ZStripInfo *pZInfo;
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- if(clipregion==NULL)
- {
- ClipX1=ClippingRect.iLeft;
- ClipY1=ClippingRect.iTop;
- ClipX2=ClippingRect.iRight;
- ClipY2=ClippingRect.iBottom;
- }
- else
- {
- ClipX1=clipregion->iLeft;
- ClipY1=clipregion->iTop;
- ClipX2=clipregion->iRight;
- ClipY2=clipregion->iBottom;
- }
- // Calculate rows hanging off each side of the screen
- LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
- RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
- TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
- BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
-
- uiLineFlag=(iTempY&1);
- // calculate the remaining rows and columns to blit
- BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
- BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
- // check if whole thing is clipped
- if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
- return(TRUE);
- // check if whole thing is clipped
- if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
- return(TRUE);
-
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- LineSkip=(uiDestPitchBYTES-(BlitLength*2));
- if(hSrcVObject->ppZStripInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- // setup for the z-column blitting stuff
- pZInfo=hSrcVObject->ppZStripInfo[sZIndex];
- if(pZInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_SUBLAYERS*10));
- if(LeftSkip > pZInfo->ubFirstZStripWidth)
- {
- usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
- usZStartCols=20-(usZStartCols%20);
- }
- else if(LeftSkip < pZInfo->ubFirstZStripWidth)
- usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
- else
- usZStartCols=20;
- // set to odd number of pixels for first column
- usZColsToGo=usZStartCols;
- pZArray=pZInfo->pbZChange;
- if(LeftSkip >= usZColsToGo)
- {
- // Index into array after doing left clipping
- usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
- //calculates the Z-value after left-side clipping
- if(usZStartIndex)
- {
- for(usCount=0; usCount < usZStartIndex; usCount++)
- {
- switch(pZArray[usCount])
- {
- case -1: usZStartLevel-=Z_SUBLAYERS;
- break;
- case 0: //no change
- break;
- case 1: usZStartLevel+=Z_SUBLAYERS;
- break;
- }
- }
- }
- }
- else
- usZStartIndex=0;
- usZLevel=usZStartLevel;
- usZIndex=usZStartIndex;
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- cmp TopSkip, 0 // check for nothing clipped on top
- je LeftSkipSetup
- // Skips the number of lines clipped at the top
- TopSkipLoop:
-
- mov cl, [esi]
- inc esi
- or cl, cl
- js TopSkipLoop
- jz TSEndLine
- add esi, ecx
- jmp TopSkipLoop
- TSEndLine:
- xor uiLineFlag, 1
- dec TopSkip
- jnz TopSkipLoop
- // Start of line loop
- // Skips the pixels hanging outside the left-side boundry
- LeftSkipSetup:
-
- mov Unblitted, 0 // Unblitted counts any pixels left from a run
- mov eax, LeftSkip // after we have skipped enough left-side pixels
- mov LSCount, eax // LSCount counts how many pixels skipped so far
- or eax, eax
- jz BlitLineSetup // check for nothing to skip
- LeftSkipLoop:
- mov cl, [esi]
- inc esi
- or cl, cl
- js LSTrans
- cmp ecx, LSCount
- je LSSkip2 // if equal, skip whole, and start blit with new run
- jb LSSkip1 // if less, skip whole thing
- add esi, LSCount // skip partial run, jump into normal loop for rest
- sub ecx, LSCount
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitNTL1 // *** jumps into non-transparent blit loop
-
- LSSkip2:
- add esi, ecx // skip whole run, and start blit with new run
- jmp BlitLineSetup
- LSSkip1:
- add esi, ecx // skip whole run, continue skipping
- sub LSCount, ecx
- jmp LeftSkipLoop
- LSTrans:
- and ecx, 07fH
- cmp ecx, LSCount
- je BlitLineSetup // if equal, skip whole, and start blit with new run
- jb LSTrans1 // if less, skip whole thing
- sub ecx, LSCount // skip partial run, jump into normal loop for rest
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitTransparent // *** jumps into transparent blit loop
-
- LSTrans1:
- sub LSCount, ecx // skip whole run, continue skipping
- jmp LeftSkipLoop
- //-------------------------------------------------
- // setup for beginning of line
- BlitLineSetup:
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- BlitDispatch:
- cmp LSCount, 0 // Check to see if we're done blitting
- je RightSkipLoop
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz RSLoop2
-
- //--------------------------------
- // blitting non-transparent pixels
- and ecx, 07fH
- BlitNTL1:
- mov ax, [ebx] // check z-level of pixel
- cmp ax, usZLevel
- jae BlitPixellate1
- jmp BlitPixel1
- BlitPixellate1:
- // OK, DO PIXELLATE SCHEME HERE!
- test uiLineFlag, 1
- jz BlitSkip1
- test edi, 2
- jz BlitNTL2
- jmp BlitPixel1
- BlitSkip1:
- test edi, 2
- jnz BlitNTL2
-
- BlitPixel1:
- mov ax, usZLevel // update z-level of pixel
- mov [ebx], ax
- // Check for shadow...
- xor eax, eax
- mov al, [esi]
- cmp al, 254
- jne BlitNTL66
- mov ax, [edi]
- mov ax, ShadeTable[eax*2]
- mov [edi], ax
- jmp BlitNTL2
- BlitNTL66:
- mov ax, [edx+eax*2] // Copy pixel
- mov [edi], ax
- BlitNTL2:
- inc esi
- add edi, 2
- add ebx, 2
- dec usZColsToGo
- jnz BlitNTL6
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitNTL5 // dir = 0 no change
- js BlitNTL4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_SUBLAYERS
- jmp BlitNTL5
- BlitNTL4:
- sub dx, Z_SUBLAYERS
- BlitNTL5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitNTL6:
- dec LSCount // decrement pixel length to blit
- jz RightSkipLoop // done blitting the visible line
-
- dec ecx
- jnz BlitNTL1 // continue current run
-
- jmp BlitDispatch // done current run, go for another
- //----------------------------
- // skipping transparent pixels
- BlitTransparent: // skip transparent pixels
- and ecx, 07fH
- BlitTrans2:
- add edi, 2 // move up the destination pointer
- add ebx, 2
-
- dec usZColsToGo
- jnz BlitTrans1
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitTrans5 // dir = 0 no change
- js BlitTrans4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_SUBLAYERS
- jmp BlitTrans5
- BlitTrans4:
- sub dx, Z_SUBLAYERS
- BlitTrans5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitTrans1:
- dec LSCount // decrement the pixels to blit
- jz RightSkipLoop // done the line
- dec ecx
- jnz BlitTrans2
- jmp BlitDispatch
- //---------------------------------------------
- // Scans the ETRLE until it finds an EOL marker
- RightSkipLoop:
-
-
- RSLoop1:
- mov al, [esi]
- inc esi
- or al, al
- jnz RSLoop1
- RSLoop2:
- xor uiLineFlag, 1
- dec BlitHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- // reset all the z-level stuff for a new line
- mov ax, usZStartLevel
- mov usZLevel, ax
- mov ax, usZStartIndex
- mov usZIndex, ax
- mov ax, usZStartCols
- mov usZColsToGo, ax
-
- jmp LeftSkipSetup
-
- BlitDone:
- }
- return(TRUE);
- }
- void CorrectRenderCenter( INT16 sRenderX, INT16 sRenderY, INT16 *pSNewX, INT16 *pSNewY )
- {
- INT16 sScreenX, sScreenY;
- INT16 sNumXSteps, sNumYSteps;
- // Use radar scale values to get screen values, then convert ot map values, rounding to nearest middle tile
- sScreenX = (INT16) sRenderX;
- sScreenY = (INT16) sRenderY;
- // Adjust for offsets!
- sScreenX += 0;
- sScreenY += 10;
- // Adjust to viewport start!
- sScreenX -= ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 );
- sScreenY -= ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 );
- //Make sure these coordinates are multiples of scroll steps
- sNumXSteps = sScreenX / gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
- sNumYSteps = sScreenY / gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
- sScreenX = ( sNumXSteps * gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ] );
- sScreenY = ( sNumYSteps * gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ]);
- // Adjust back
- sScreenX += ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 );
- sScreenY += ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 );
- *pSNewX = sScreenX;
- *pSNewY = sScreenY;
- }
- // Blitter Specs
- // 1 ) 8 to 16 bpp
- // 2 ) strip z-blitter
- // 3 ) clipped
- // 4 ) trans shadow - if value is 254, makes a shadow
- //
- BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette )
- {
- UINT32 uiOffset;
- UINT32 usHeight, usWidth, Unblitted;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
- INT32 ClipX1, ClipY1, ClipX2, ClipY2;
- UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
- INT8 *pZArray;
- ZStripInfo *pZInfo;
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- if(clipregion==NULL)
- {
- ClipX1=ClippingRect.iLeft;
- ClipY1=ClippingRect.iTop;
- ClipX2=ClippingRect.iRight;
- ClipY2=ClippingRect.iBottom;
- }
- else
- {
- ClipX1=clipregion->iLeft;
- ClipY1=clipregion->iTop;
- ClipX2=clipregion->iRight;
- ClipY2=clipregion->iBottom;
- }
- // Calculate rows hanging off each side of the screen
- LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
- RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
- TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
- BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
-
- // calculate the remaining rows and columns to blit
- BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
- BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
- // check if whole thing is clipped
- if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
- return(TRUE);
- // check if whole thing is clipped
- if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
- return(TRUE);
-
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
- LineSkip=(uiDestPitchBYTES-(BlitLength*2));
- if(hSrcVObject->ppZStripInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- // setup for the z-column blitting stuff
- pZInfo=hSrcVObject->ppZStripInfo[sZIndex];
- if(pZInfo==NULL)
- {
- DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
- return(FALSE);
- }
- usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_SUBLAYERS*10));
- if(LeftSkip > pZInfo->ubFirstZStripWidth)
- {
- usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
- usZStartCols=20-(usZStartCols%20);
- }
- else if(LeftSkip < pZInfo->ubFirstZStripWidth)
- usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
- else
- usZStartCols=20;
- // set to odd number of pixels for first column
- usZColsToGo=usZStartCols;
- pZArray=pZInfo->pbZChange;
- if(LeftSkip >= usZColsToGo)
- {
- // Index into array after doing left clipping
- usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
- //calculates the Z-value after left-side clipping
- if(usZStartIndex)
- {
- for(usCount=0; usCount < usZStartIndex; usCount++)
- {
- switch(pZArray[usCount])
- {
- case -1: usZStartLevel-=Z_SUBLAYERS;
- break;
- case 0: //no change
- break;
- case 1: usZStartLevel+=Z_SUBLAYERS;
- break;
- }
- }
- }
- }
- else
- usZStartIndex=0;
- usZLevel=usZStartLevel;
- usZIndex=usZStartIndex;
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- cmp TopSkip, 0 // check for nothing clipped on top
- je LeftSkipSetup
- // Skips the number of lines clipped at the top
- TopSkipLoop:
-
- mov cl, [esi]
- inc esi
- or cl, cl
- js TopSkipLoop
- jz TSEndLine
- add esi, ecx
- jmp TopSkipLoop
- TSEndLine:
- dec TopSkip
- jnz TopSkipLoop
- // Start of line loop
- // Skips the pixels hanging outside the left-side boundry
- LeftSkipSetup:
-
- mov Unblitted, 0 // Unblitted counts any pixels left from a run
- mov eax, LeftSkip // after we have skipped enough left-side pixels
- mov LSCount, eax // LSCount counts how many pixels skipped so far
- or eax, eax
- jz BlitLineSetup // check for nothing to skip
- LeftSkipLoop:
- mov cl, [esi]
- inc esi
- or cl, cl
- js LSTrans
- cmp ecx, LSCount
- je LSSkip2 // if equal, skip whole, and start blit with new run
- jb LSSkip1 // if less, skip whole thing
- add esi, LSCount // skip partial run, jump into normal loop for rest
- sub ecx, LSCount
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitNTL1 // *** jumps into non-transparent blit loop
-
- LSSkip2:
- add esi, ecx // skip whole run, and start blit with new run
- jmp BlitLineSetup
- LSSkip1:
- add esi, ecx // skip whole run, continue skipping
- sub LSCount, ecx
- jmp LeftSkipLoop
- LSTrans:
- and ecx, 07fH
- cmp ecx, LSCount
- je BlitLineSetup // if equal, skip whole, and start blit with new run
- jb LSTrans1 // if less, skip whole thing
- sub ecx, LSCount // skip partial run, jump into normal loop for rest
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- jmp BlitTransparent // *** jumps into transparent blit loop
-
- LSTrans1:
- sub LSCount, ecx // skip whole run, continue skipping
- jmp LeftSkipLoop
- //-------------------------------------------------
- // setup for beginning of line
- BlitLineSetup:
- mov eax, BlitLength
- mov LSCount, eax
- mov Unblitted, 0
- BlitDispatch:
- cmp LSCount, 0 // Check to see if we're done blitting
- je RightSkipLoop
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz RSLoop2
-
- //--------------------------------
- // blitting non-transparent pixels
- and ecx, 07fH
- BlitNTL1:
- mov ax, [ebx] // check z-level of pixel
- cmp ax, usZLevel
- ja BlitNTL2
- mov ax, usZLevel // update z-level of pixel
- mov [ebx], ax
- // Check for shadow...
- xor eax, eax
- mov al, [esi]
- cmp al, 254
- jne BlitNTL66
- mov ax, [edi]
- mov ax, ShadeTable[eax*2]
- mov [edi], ax
- jmp BlitNTL2
- BlitNTL66:
- mov ax, [edx+eax*2] // Copy pixel
- mov [edi], ax
- BlitNTL2:
- inc esi
- add edi, 2
- add ebx, 2
- dec usZColsToGo
- jnz BlitNTL6
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitNTL5 // dir = 0 no change
- js BlitNTL4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_SUBLAYERS
- jmp BlitNTL5
- BlitNTL4:
- sub dx, Z_SUBLAYERS
- BlitNTL5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitNTL6:
- dec LSCount // decrement pixel length to blit
- jz RightSkipLoop // done blitting the visible line
-
- dec ecx
- jnz BlitNTL1 // continue current run
-
- jmp BlitDispatch // done current run, go for another
- //----------------------------
- // skipping transparent pixels
- BlitTransparent: // skip transparent pixels
- and ecx, 07fH
- BlitTrans2:
- add edi, 2 // move up the destination pointer
- add ebx, 2
-
- dec usZColsToGo
- jnz BlitTrans1
- // update the z-level according to the z-table
- push edx
- mov edx, pZArray // get pointer to array
- xor eax, eax
- mov ax, usZIndex // pick up the current array index
- add edx, eax
- inc eax // increment it
- mov usZIndex, ax // store incremented value
- mov al, [edx] // get direction instruction
- mov dx, usZLevel // get current z-level
- or al, al
- jz BlitTrans5 // dir = 0 no change
- js BlitTrans4 // dir < 0 z-level down
- // dir > 0 z-level up (default)
- add dx, Z_SUBLAYERS
- jmp BlitTrans5
- BlitTrans4:
- sub dx, Z_SUBLAYERS
- BlitTrans5:
- mov usZLevel, dx // store the now-modified z-level
- mov usZColsToGo, 20 // reset the next z-level change to 20 cols
- pop edx
- BlitTrans1:
- dec LSCount // decrement the pixels to blit
- jz RightSkipLoop // done the line
- dec ecx
- jnz BlitTrans2
- jmp BlitDispatch
- //---------------------------------------------
- // Scans the ETRLE until it finds an EOL marker
- RightSkipLoop:
-
-
- RSLoop1:
- mov al, [esi]
- inc esi
- or al, al
- jnz RSLoop1
- RSLoop2:
- dec BlitHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- // reset all the z-level stuff for a new line
- mov ax, usZStartLevel
- mov usZLevel, ax
- mov ax, usZStartIndex
- mov usZIndex, ax
- mov ax, usZStartCols
- mov usZColsToGo, ax
-
- jmp LeftSkipSetup
-
- BlitDone:
- }
- return(TRUE);
- }
- void RenderRoomInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
- {
- INT8 bXOddFlag = 0;
- INT16 sAnchorPosX_M, sAnchorPosY_M;
- INT16 sAnchorPosX_S, sAnchorPosY_S;
- INT16 sTempPosX_M, sTempPosY_M;
- INT16 sTempPosX_S, sTempPosY_S;
- BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
- UINT16 usTileIndex;
- INT16 sX, sY;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- // Begin Render Loop
- sAnchorPosX_M = sStartPointX_M;
- sAnchorPosY_M = sStartPointY_M;
- sAnchorPosX_S = sStartPointX_S;
- sAnchorPosY_S = sStartPointY_S;
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- do
- {
- fEndRenderRow = FALSE;
- sTempPosX_M = sAnchorPosX_M;
- sTempPosY_M = sAnchorPosY_M;
- sTempPosX_S = sAnchorPosX_S;
- sTempPosY_S = sAnchorPosY_S;
- if(bXOddFlag > 0)
- sTempPosX_S += 20;
- do
- {
- usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
- if ( usTileIndex < GRIDSIZE )
- {
- sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
- sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
- // THIS ROOM STUFF IS ONLY DONE IN THE EDITOR...
- // ADJUST BY SHEIGHT
- sY -= gpWorldLevelData[ usTileIndex ].sHeight;
- //sY += gsRenderHeight;
- if ( gubWorldRoomInfo[ usTileIndex ] != NO_ROOM )
- {
- SetFont( SMALLCOMPFONT );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
- switch( gubWorldRoomInfo[ usTileIndex ] % 5 )
- {
- case 0: SetFontForeground( FONT_GRAY3 ); break;
- case 1: SetFontForeground( FONT_YELLOW ); break;
- case 2: SetFontForeground( FONT_LTRED ); break;
- case 3: SetFontForeground( FONT_LTBLUE ); break;
- case 4: SetFontForeground( FONT_LTGREEN );break;
- }
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gubWorldRoomInfo[ usTileIndex ] );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
- }
-
- sTempPosX_S += 40;
- sTempPosX_M ++;
- sTempPosY_M --;
- if ( sTempPosX_S >= sEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- if ( bXOddFlag > 0 )
- {
- sAnchorPosY_M ++;
- }
- else
- {
- sAnchorPosX_M ++;
- }
-
- bXOddFlag = !bXOddFlag;
- sAnchorPosY_S += 10;
- if ( sAnchorPosY_S >= sEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- UnLockVideoSurface( FRAME_BUFFER );
- }
- #ifdef _DEBUG
- void RenderFOVDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
- {
- INT8 bXOddFlag = 0;
- INT16 sAnchorPosX_M, sAnchorPosY_M;
- INT16 sAnchorPosX_S, sAnchorPosY_S;
- INT16 sTempPosX_M, sTempPosY_M;
- INT16 sTempPosX_S, sTempPosY_S;
- BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
- UINT16 usTileIndex;
- INT16 sX, sY;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- // Begin Render Loop
- sAnchorPosX_M = sStartPointX_M;
- sAnchorPosY_M = sStartPointY_M;
- sAnchorPosX_S = sStartPointX_S;
- sAnchorPosY_S = sStartPointY_S;
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- do
- {
- fEndRenderRow = FALSE;
- sTempPosX_M = sAnchorPosX_M;
- sTempPosY_M = sAnchorPosY_M;
- sTempPosX_S = sAnchorPosX_S;
- sTempPosY_S = sAnchorPosY_S;
- if(bXOddFlag > 0)
- sTempPosX_S += 20;
- do
- {
- usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
- if ( usTileIndex < GRIDSIZE )
- {
- sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
- sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
- // Adjust for interface level
- sY -= gpWorldLevelData[ usTileIndex ].sHeight;
- sY += gsRenderHeight;
- if ( gubFOVDebugInfoInfo[ usTileIndex ] != 0 )
- {
- SetFont( SMALLCOMPFONT );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
- SetFontForeground( FONT_GRAY3 );
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gubFOVDebugInfoInfo[ usTileIndex ] );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, gTileDatabase[0].hTileSurface, sTempPosX_S, sTempPosY_S, 0, &gClippingRect );
- }
- if ( gubGridNoMarkers[ usTileIndex ] == gubGridNoValue )
- {
- SetFont( SMALLCOMPFONT );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
- SetFontForeground( FONT_FCOLOR_YELLOW );
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY + 4 , L"x" );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
- }
-
- sTempPosX_S += 40;
- sTempPosX_M ++;
- sTempPosY_M --;
- if ( sTempPosX_S >= sEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- if ( bXOddFlag > 0 )
- {
- sAnchorPosY_M ++;
- }
- else
- {
- sAnchorPosX_M ++;
- }
-
- bXOddFlag = !bXOddFlag;
- sAnchorPosY_S += 10;
- if ( sAnchorPosY_S >= sEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- UnLockVideoSurface( FRAME_BUFFER );
- }
- void RenderCoverDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
- {
- INT8 bXOddFlag = 0;
- INT16 sAnchorPosX_M, sAnchorPosY_M;
- INT16 sAnchorPosX_S, sAnchorPosY_S;
- INT16 sTempPosX_M, sTempPosY_M;
- INT16 sTempPosX_S, sTempPosY_S;
- BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
- UINT16 usTileIndex;
- INT16 sX, sY;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- // Begin Render Loop
- sAnchorPosX_M = sStartPointX_M;
- sAnchorPosY_M = sStartPointY_M;
- sAnchorPosX_S = sStartPointX_S;
- sAnchorPosY_S = sStartPointY_S;
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- do
- {
- fEndRenderRow = FALSE;
- sTempPosX_M = sAnchorPosX_M;
- sTempPosY_M = sAnchorPosY_M;
- sTempPosX_S = sAnchorPosX_S;
- sTempPosY_S = sAnchorPosY_S;
- if(bXOddFlag > 0)
- sTempPosX_S += 20;
- do
- {
- usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
- if ( usTileIndex < GRIDSIZE )
- {
- sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
- sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
-
- // Adjust for interface level
- sY -= gpWorldLevelData[ usTileIndex ].sHeight;
- sY += gsRenderHeight;
-
- if (gsCoverValue[ usTileIndex] != 0x7F7F)
- {
- SetFont( SMALLCOMPFONT );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
- if (usTileIndex == gsBestCover)
- {
- SetFontForeground( FONT_MCOLOR_RED );
- }
- else if (gsCoverValue[ usTileIndex ] < 0)
- {
- SetFontForeground( FONT_MCOLOR_WHITE );
- }
- else
- {
- SetFontForeground( FONT_GRAY3 );
- }
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gsCoverValue[ usTileIndex ] );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
- }
-
- sTempPosX_S += 40;
- sTempPosX_M ++;
- sTempPosY_M --;
- if ( sTempPosX_S >= sEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- if ( bXOddFlag > 0 )
- {
- sAnchorPosY_M ++;
- }
- else
- {
- sAnchorPosX_M ++;
- }
-
- bXOddFlag = !bXOddFlag;
- sAnchorPosY_S += 10;
- if ( sAnchorPosY_S >= sEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- UnLockVideoSurface( FRAME_BUFFER );
- }
- void RenderGridNoVisibleDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
- {
- INT8 bXOddFlag = 0;
- INT16 sAnchorPosX_M, sAnchorPosY_M;
- INT16 sAnchorPosX_S, sAnchorPosY_S;
- INT16 sTempPosX_M, sTempPosY_M;
- INT16 sTempPosX_S, sTempPosY_S;
- BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
- UINT16 usTileIndex;
- INT16 sX, sY;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- // Begin Render Loop
- sAnchorPosX_M = sStartPointX_M;
- sAnchorPosY_M = sStartPointY_M;
- sAnchorPosX_S = sStartPointX_S;
- sAnchorPosY_S = sStartPointY_S;
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- do
- {
- fEndRenderRow = FALSE;
- sTempPosX_M = sAnchorPosX_M;
- sTempPosY_M = sAnchorPosY_M;
- sTempPosX_S = sAnchorPosX_S;
- sTempPosY_S = sAnchorPosY_S;
- if(bXOddFlag > 0)
- sTempPosX_S += 20;
- do
- {
- usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
- if ( usTileIndex < GRIDSIZE )
- {
- sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
- sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
-
- // Adjust for interface level
- sY -= gpWorldLevelData[ usTileIndex ].sHeight;
- sY += gsRenderHeight;
-
- SetFont( SMALLCOMPFONT );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
- if ( !GridNoOnVisibleWorldTile( usTileIndex ) )
- {
- SetFontForeground( FONT_MCOLOR_RED );
- }
- else
- {
- SetFontForeground( FONT_GRAY3 );
- }
- mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", usTileIndex );
- SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
- }
-
- sTempPosX_S += 40;
- sTempPosX_M ++;
- sTempPosY_M --;
- if ( sTempPosX_S >= sEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- if ( bXOddFlag > 0 )
- {
- sAnchorPosY_M ++;
- }
- else
- {
- sAnchorPosX_M ++;
- }
-
- bXOddFlag = !bXOddFlag;
- sAnchorPosY_S += 10;
- if ( sAnchorPosY_S >= sEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- UnLockVideoSurface( FRAME_BUFFER );
- }
- #endif
- void ExamineZBufferRect( INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom)
- {
- CalcRenderParameters( sLeft, sTop, sRight, sBottom );
- ExamineZBufferForHiddenTiles( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
- {
- INT8 bXOddFlag = 0;
- INT16 sAnchorPosX_M, sAnchorPosY_M;
- INT16 sAnchorPosX_S, sAnchorPosY_S;
- INT16 sTempPosX_M, sTempPosY_M;
- INT16 sTempPosX_S, sTempPosY_S;
- BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
- UINT16 usTileIndex;
- INT16 sX, sY, sWorldX, sZLevel;
- UINT32 uiDestPitchBYTES;
- UINT8 *pDestBuf;
- TILE_ELEMENT *TileElem;
- INT8 bBlitClipVal;
- LEVELNODE *pObject;
- // Begin Render Loop
- sAnchorPosX_M = sStartPointX_M;
- sAnchorPosY_M = sStartPointY_M;
- sAnchorPosX_S = sStartPointX_S;
- sAnchorPosY_S = sStartPointY_S;
- pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
- // Get VObject for firt land peice!
- TileElem = &(gTileDatabase[ FIRSTTEXTURE1 ] );
- do
- {
- fEndRenderRow = FALSE;
- sTempPosX_M = sAnchorPosX_M;
- sTempPosY_M = sAnchorPosY_M;
- sTempPosX_S = sAnchorPosX_S;
- sTempPosY_S = sAnchorPosY_S;
- if(bXOddFlag > 0)
- sTempPosX_S += 20;
- do
- {
- usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
- if ( usTileIndex < GRIDSIZE )
- {
- // ATE: Don;t let any vehicle sit here....
- if ( FindStructure( usTileIndex, ( STRUCTURE_MOBILE ) ) )
- {
- // Continue...
- goto ENDOFLOOP;
- }
- sX = sTempPosX_S;
- sY = sTempPosY_S - gpWorldLevelData[usTileIndex].sHeight;
- // Adjust for interface level
- sY += gsRenderHeight;
- // Caluluate zvalue
- // Look for anything less than struct layer!
- GetWorldXYAbsoluteScreenXY( sTempPosX_M, sTempPosY_M, &sWorldX, &sZLevel);
- sZLevel += gsRenderHeight;
-
- sZLevel=(sZLevel*Z_SUBLAYERS)+STRUCT_Z_LEVEL;
- if ( gpWorldLevelData[usTileIndex].uiFlags & MAPELEMENT_REEVALUATE_REDUNDENCY )
- {
- bBlitClipVal = BltIsClippedOrOffScreen(TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex, &gClippingRect);
- if ( bBlitClipVal == FALSE )
- {
- // Set flag to not evaluate again!
- gpWorldLevelData[usTileIndex].uiFlags &= (~MAPELEMENT_REEVALUATE_REDUNDENCY );
- // OK, first do some rules with exceptions
- // Don't let this happen for roads!
- pObject = gpWorldLevelData[usTileIndex ].pObjectHead;
- if ( IsTileRedundent( gpZBuffer, sZLevel, TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex ) )
- {
- // Mark in the world!
- gpWorldLevelData[ usTileIndex ].uiFlags |= MAPELEMENT_REDUNDENT;
- }
- else
- {
- // Un Mark in the world!
- gpWorldLevelData[ usTileIndex ].uiFlags &= (~MAPELEMENT_REDUNDENT);
- }
- }
- }
- }
- ENDOFLOOP:
-
- sTempPosX_S += 40;
- sTempPosX_M ++;
- sTempPosY_M --;
- if ( sTempPosX_S >= sEndXS )
- {
- fEndRenderRow = TRUE;
- }
- } while( !fEndRenderRow );
- if ( bXOddFlag > 0 )
- {
- sAnchorPosY_M ++;
- }
- else
- {
- sAnchorPosX_M ++;
- }
-
- bXOddFlag = !bXOddFlag;
- sAnchorPosY_S += 10;
- if ( sAnchorPosY_S >= sEndYS )
- {
- fEndRenderCol = TRUE;
- }
- }
- while( !fEndRenderCol );
- UnLockVideoSurface( FRAME_BUFFER );
- }
- void CalcRenderParameters(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom )
- {
- INT16 sTempPosX_W, sTempPosY_W;
- INT16 sRenderCenterX_W, sRenderCenterY_W;
- INT16 sOffsetX_W, sOffsetY_W, sOffsetX_S, sOffsetY_S;
- gOldClipRect = gClippingRect;
- // Set new clipped rect
- gClippingRect.iLeft = __max( gsVIEWPORT_START_X, sLeft);
- gClippingRect.iRight = __min( gsVIEWPORT_END_X, sRight);
- gClippingRect.iTop = __max( gsVIEWPORT_WINDOW_START_Y, sTop);
- gClippingRect.iBottom = __min(gsVIEWPORT_WINDOW_END_Y, sBottom);
- gsEndXS = sRight + VIEWPORT_XOFFSET_S;
- gsEndYS = sBottom + VIEWPORT_YOFFSET_S;
- sRenderCenterX_W = gsRenderCenterX;
- sRenderCenterY_W = gsRenderCenterY;
- // STEP THREE - determine starting point in world coords
- // a) Determine where in screen coords to start rendering
- gsStartPointX_S = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) - (sLeft - VIEWPORT_XOFFSET_S);
- gsStartPointY_S = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) - (sTop - VIEWPORT_YOFFSET_S);
- // b) Convert these distances into world distances
- FromScreenToCellCoordinates( gsStartPointX_S, gsStartPointY_S, &sTempPosX_W, &sTempPosY_W );
- // c) World start point is Render center minus this distance
- gsStartPointX_W = sRenderCenterX_W - sTempPosX_W;
- gsStartPointY_W = sRenderCenterY_W - sTempPosY_W;
- // NOTE: Increase X map value by 1 tile to offset where on screen we are...
- if ( gsStartPointX_W > 0 )
- gsStartPointX_W += CELL_X_SIZE;
- // d) screen start point is screen distances minus screen center
- gsStartPointX_S = sLeft - VIEWPORT_XOFFSET_S;
- gsStartPointY_S = sTop - VIEWPORT_YOFFSET_S;
- // STEP FOUR - Determine Start block
- // a) Find start block
- gsStartPointX_M = ( gsStartPointX_W ) / CELL_X_SIZE;
- gsStartPointY_M = ( gsStartPointY_W ) / CELL_Y_SIZE;
- // STEP 5 - Determine Deltas for center and find screen values
- //Make sure these coordinates are multiples of scroll steps
- sOffsetX_W = abs( gsStartPointX_W ) - ( abs( ( gsStartPointX_M * CELL_X_SIZE ) ) );
- sOffsetY_W = abs( gsStartPointY_W ) - ( abs( ( gsStartPointY_M * CELL_Y_SIZE ) ) );
- FromCellToScreenCoordinates( sOffsetX_W, sOffsetY_W, &sOffsetX_S, &sOffsetY_S );
- if ( gsStartPointY_W < 0 )
- {
- gsStartPointY_S += 0;//(sOffsetY_S/2);
- }
- else
- {
- gsStartPointY_S -= sOffsetY_S;
- }
- gsStartPointX_S -= sOffsetX_S;
- // Set globals for render offset
- if ( gsRenderWorldOffsetX == -1 )
- {
- gsRenderWorldOffsetX = sOffsetX_S;
- }
- if ( gsRenderWorldOffsetY == -1 )
- {
- gsRenderWorldOffsetY = sOffsetY_S;
- }
- /////////////////////////////////////////
- //ATE: CALCULATE LARGER OFFSET VALUES
- gsLEndXS = sRight + LARGER_VIEWPORT_XOFFSET_S;
- gsLEndYS = sBottom + LARGER_VIEWPORT_YOFFSET_S;
- // STEP THREE - determine starting point in world coords
- // a) Determine where in screen coords to start rendering
- gsLStartPointX_S = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) - (sLeft - LARGER_VIEWPORT_XOFFSET_S);
- gsLStartPointY_S = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) - (sTop - LARGER_VIEWPORT_YOFFSET_S);
- // b) Convert these distances into world distances
- FromScreenToCellCoordinates( gsLStartPointX_S, gsLStartPointY_S, &sTempPosX_W, &sTempPosY_W );
- // c) World start point is Render center minus this distance
- gsLStartPointX_W = sRenderCenterX_W - sTempPosX_W;
- gsLStartPointY_W = sRenderCenterY_W - sTempPosY_W;
- // NOTE: Increase X map value by 1 tile to offset where on screen we are...
- if ( gsLStartPointX_W > 0 )
- gsLStartPointX_W += CELL_X_SIZE;
- // d) screen start point is screen distances minus screen center
- gsLStartPointX_S = sLeft - LARGER_VIEWPORT_XOFFSET_S;
- gsLStartPointY_S = sTop - LARGER_VIEWPORT_YOFFSET_S;
- // STEP FOUR - Determine Start block
- // a) Find start block
- gsLStartPointX_M = ( gsLStartPointX_W ) / CELL_X_SIZE;
- gsLStartPointY_M = ( gsLStartPointY_W ) / CELL_Y_SIZE;
- // Adjust starting screen coordinates
- gsLStartPointX_S -= sOffsetX_S;
- if ( gsLStartPointY_W < 0 )
- {
- gsLStartPointY_S += 0;
- gsLStartPointX_S -= 20;
- }
- else
- {
- gsLStartPointY_S -= sOffsetY_S;
- }
- }
- void ResetRenderParameters( )
- {
- // Restore clipping rect
- gClippingRect = gOldClipRect;
- }
- BOOLEAN Zero8BPPDataTo16BPPBufferTransparent( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
- {
- UINT32 uiOffset;
- UINT32 usHeight, usWidth;
- UINT8 *SrcPtr, *DestPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY;
-
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- // Validations
- CHECKF( iTempX >= 0 );
- CHECKF( iTempY >= 0 );
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
- LineSkip=(uiDestPitchBYTES-(usWidth*2));
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- xor eax, eax
- xor ebx, ebx
- xor ecx, ecx
- BlitDispatch:
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz BlitDoneLine
- //BlitNonTransLoop:
- clc
- rcr cl, 1
- jnc BlitNTL2
- mov [edi], ax
-
- inc esi
- add edi, 2
- BlitNTL2:
- clc
- rcr cl, 1
- jnc BlitNTL3
- mov [edi], ax
- mov [edi+2], ax
- add esi, 2
- add edi, 4
- BlitNTL3:
- or cl, cl
- jz BlitDispatch
- xor ebx, ebx
- BlitNTL4:
-
- mov [edi], ax
- mov [edi+2], ax
- mov [edi+4], ax
- mov [edi+6], ax
- add esi, 4
- add edi, 8
- dec cl
- jnz BlitNTL4
- jmp BlitDispatch
- BlitTransparent:
- and ecx, 07fH
- // shl ecx, 1
- add ecx, ecx
- add edi, ecx
- jmp BlitDispatch
- BlitDoneLine:
-
- dec usHeight
- jz BlitDone
- add edi, LineSkip
- jmp BlitDispatch
-
- BlitDone:
- }
- return(TRUE);
- }
- BOOLEAN Blt8BPPDataTo16BPPBufferTransInvZ( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
- {
- UINT16 *p16BPPPalette;
- UINT32 uiOffset;
- UINT32 usHeight, usWidth;
- UINT8 *SrcPtr, *DestPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY;
-
- // Assertions
- Assert( hSrcVObject != NULL );
- Assert( pBuffer != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- // Validations
- CHECKF( iTempX >= 0 );
- CHECKF( iTempY >= 0 );
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
- ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
- p16BPPPalette = hSrcVObject->pShadeCurrent;
- LineSkip=(uiDestPitchBYTES-(usWidth*2));
- __asm {
- mov esi, SrcPtr
- mov edi, DestPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- BlitDispatch:
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz BlitDoneLine
- //BlitNonTransLoop:
- xor eax, eax
- BlitNTL4:
-
- mov ax, usZValue
- cmp ax, [ebx]
- jne BlitNTL5
- //mov [ebx], ax
-
- xor ah, ah
- mov al, [esi]
- mov ax, [edx+eax*2]
- mov [edi], ax
-
- BlitNTL5:
- inc esi
- inc edi
- inc ebx
- inc edi
- inc ebx
- dec cl
- jnz BlitNTL4
- jmp BlitDispatch
- BlitTransparent:
- and ecx, 07fH
- // shl ecx, 1
- add ecx, ecx
- add edi, ecx
- add ebx, ecx
- jmp BlitDispatch
- BlitDoneLine:
-
- dec usHeight
- jz BlitDone
- add edi, LineSkip
- add ebx, LineSkip
- jmp BlitDispatch
-
- BlitDone:
- }
- return(TRUE);
- }
- BOOLEAN IsTileRedundent( UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
- {
- UINT16 *p16BPPPalette;
- UINT32 uiOffset;
- UINT32 usHeight, usWidth;
- UINT8 *SrcPtr, *ZPtr;
- UINT32 LineSkip;
- ETRLEObject *pTrav;
- INT32 iTempX, iTempY;
- BOOLEAN fHidden = TRUE;
-
- // Assertions
- Assert( hSrcVObject != NULL );
- // Get Offsets from Index into structure
- pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
- usHeight = (UINT32)pTrav->usHeight;
- usWidth = (UINT32)pTrav->usWidth;
- uiOffset = pTrav->uiDataOffset;
- // Add to start position of dest buffer
- iTempX = iX + pTrav->sOffsetX;
- iTempY = iY + pTrav->sOffsetY;
- // Validations
- CHECKF( iTempX >= 0 );
- CHECKF( iTempY >= 0 );
- SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
- ZPtr = (UINT8 *)pZBuffer + (1280*iTempY) + (iTempX*2);
- p16BPPPalette = hSrcVObject->pShadeCurrent;
- LineSkip=(1280-(usWidth*2));
- __asm {
- mov esi, SrcPtr
- mov edx, p16BPPPalette
- xor eax, eax
- mov ebx, ZPtr
- xor ecx, ecx
- BlitDispatch:
- mov cl, [esi]
- inc esi
- or cl, cl
- js BlitTransparent
- jz BlitDoneLine
- //BlitNonTransLoop:
- xor eax, eax
- BlitNTL4:
-
- mov ax, usZValue
- cmp ax, [ebx]
- jle BlitNTL5
- // Set false, flag
- mov fHidden, 0
- jmp BlitDone
-
- BlitNTL5:
- inc esi
- inc ebx
- inc ebx
- dec cl
- jnz BlitNTL4
- jmp BlitDispatch
- BlitTransparent:
- and ecx, 07fH
- // shl ecx, 1
- add ecx, ecx
- add ebx, ecx
- jmp BlitDispatch
- BlitDoneLine:
-
- dec usHeight
- jz BlitDone
- add ebx, LineSkip
- jmp BlitDispatch
-
- BlitDone:
- }
- return(fHidden);
- }
- void SetMercGlowFast( )
- {
- //gpGlowFramePointer = gsFastGlowFrames;
- }
- void SetMercGlowNormal( )
- {
- gpGlowFramePointer = gsGlowFrames;
- }
- #if 0
- if ( gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_MOVING )
- {
- if ( sZOffsetY > 0 )
- {
- sZOffsetY++;
- }
- if ( sZOffsetX > 0 )
- {
- sZOffsetX++;
- }
- }
- sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
- sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
- if ( ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE ) )\
- {\
- sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
- sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
- \
- GetMapXYWorldY( sMapX + sZOffsetX, sMapY + sZOffsetY, sWorldY );\
- }\
- else
- #endif
- void SetRenderCenter( INT16 sNewX, INT16 sNewY )
- {
- if ( gfIgnoreScrolling == 1 )
- {
- return;
- }
- // Apply these new coordinates to the renderer!
- ApplyScrolling( sNewX, sNewY, TRUE , FALSE );
- // Set flag to ignore scrolling this frame
- gfIgnoreScrollDueToCenterAdjust = TRUE;
- // Set full render flag!
- // DIRTY THE WORLD!
- SetRenderFlags(RENDER_FLAG_FULL);
- gfPlotNewMovement = TRUE;
- if ( gfScrollPending == TRUE )
- {
- // Do a complete rebuild!
- gfScrollPending = FALSE;
- // Restore Interface!
- RestoreInterface( );
- // Delete Topmost blitters saved areas
- DeleteVideoOverlaysArea( );
- }
- gfScrollInertia = FALSE;
- }
- #ifdef _DEBUG
- void RenderFOVDebug( )
- {
- RenderFOVDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- void RenderCoverDebug( )
- {
- RenderCoverDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- void RenderGridNoVisibleDebug( )
- {
- RenderGridNoVisibleDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
- }
- #endif
|