renderworld.c 202 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551
  1. #ifdef PRECOMPILEDHEADERS
  2. #include "TileEngine All.h"
  3. #else
  4. #include "math.h"
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include "worlddef.h"
  8. #include "renderworld.h"
  9. #include "vsurface.h"
  10. #include "input.h"
  11. #include "sysutil.h"
  12. #include "wchar.h"
  13. #include "video.h"
  14. #include "vobject_blitters.h"
  15. #include "debug.h"
  16. #include "wcheck.h"
  17. #include "worldman.h"
  18. #include "jascreens.h"
  19. #include "edit_sys.h"
  20. #include "Isometric Utils.h"
  21. #include "line.h"
  22. #include "Animation Control.h"
  23. #include "Animation Data.h"
  24. #include "Timer Control.h"
  25. #include "Radar Screen.h"
  26. #include "Render Dirty.h"
  27. #include "Font Control.h"
  28. #include "Sys Globals.h"
  29. #include "Render Dirty.h"
  30. #include "lighting.h"
  31. #include "Overhead types.h"
  32. #include "Overhead.h"
  33. #include "weapons.h"
  34. #include "ai.h"
  35. #include "vobject.h"
  36. #include "render fun.h"
  37. #include "los.h"
  38. #include "interactive tiles.h"
  39. #include "interface cursors.h"
  40. #include "rotting corpses.h"
  41. #include "tile cache.h"
  42. #include "tile animation.h"
  43. #include "English.h"
  44. #include "world items.h"
  45. #include "GameSettings.h"
  46. #include "interface control.h"
  47. #endif
  48. ///////////////////////////
  49. // C file include here
  50. #include "Render Z.c"
  51. ///////////////////////////
  52. extern INT8 gDebugStr[128];
  53. extern BOOLEAN fLandLayerDirty = TRUE;
  54. extern INT16 gsVIEWPORT_START_X;
  55. extern INT16 gsVIEWPORT_START_Y;
  56. extern INT16 gsVIEWPORT_END_Y;
  57. extern INT16 gsVIEWPORT_WINDOW_END_Y;
  58. extern INT16 gsVIEWPORT_WINDOW_START_Y;
  59. extern INT16 gsVIEWPORT_END_X;
  60. UINT16 *gpZBuffer=NULL;
  61. BOOLEAN gfTagAnimatedTiles=TRUE;
  62. INT16 gsCurrentGlowFrame = 0;
  63. INT16 gsCurrentItemGlowFrame = 0;
  64. extern BOOLEAN gfUIShowExitEast;
  65. extern BOOLEAN gfUIShowExitWest;
  66. extern BOOLEAN gfUIShowExitNorth;
  67. extern BOOLEAN gfUIShowExitSouth;
  68. extern BOOLEAN gfTopMessageDirty;
  69. // VIEWPORT OFFSET VALUES
  70. // NOTE:
  71. // THESE VALUES MUST BE MULTIPLES OF TILE SIZES!
  72. #define VIEWPORT_XOFFSET_S WORLD_TILE_X*1
  73. #define VIEWPORT_YOFFSET_S WORLD_TILE_Y*2
  74. #define LARGER_VIEWPORT_XOFFSET_S ( VIEWPORT_XOFFSET_S * 3 )
  75. #define LARGER_VIEWPORT_YOFFSET_S ( VIEWPORT_YOFFSET_S * 5 )
  76. #define TILES_TYPE_BITMASK 0x00040000
  77. #define TILES_TYPE_MASK 0x07ffffff
  78. #define TILES_DIRTY 0x80000000
  79. #define TILES_DYNAMIC 0x40000000
  80. #define TILES_NOZWRITE 0x20000000
  81. #define TILES_MARKED 0x10000000
  82. #define TILES_NOZ 0x04000000
  83. #define TILES_DOALL 0x02000000
  84. #define TILES_OBSCURED 0x01000000
  85. //#define TILES_MERC 0x00000400
  86. //#define TILES_Z_BLITTER 0x00000200
  87. //#define TILES_Z_WRITE 0x00000100
  88. //#define TILES_SHADOW 0x00000080
  89. //#define TILES_BACKWARDS 0x00000040
  90. #define MAX_RENDERED_ITEMS 3
  91. // RENDERER FLAGS FOR DIFFERENT RENDER LEVELS
  92. typedef enum
  93. {
  94. RENDER_STATIC_LAND,
  95. RENDER_STATIC_OBJECTS,
  96. RENDER_STATIC_SHADOWS,
  97. RENDER_STATIC_STRUCTS,
  98. RENDER_STATIC_ROOF,
  99. RENDER_STATIC_ONROOF,
  100. RENDER_STATIC_TOPMOST,
  101. RENDER_DYNAMIC_LAND,
  102. RENDER_DYNAMIC_OBJECTS,
  103. RENDER_DYNAMIC_SHADOWS,
  104. RENDER_DYNAMIC_STRUCT_MERCS,
  105. RENDER_DYNAMIC_MERCS,
  106. RENDER_DYNAMIC_STRUCTS,
  107. RENDER_DYNAMIC_ROOF,
  108. RENDER_DYNAMIC_HIGHMERCS,
  109. RENDER_DYNAMIC_ONROOF,
  110. RENDER_DYNAMIC_TOPMOST,
  111. NUM_RENDER_FX_TYPES
  112. };
  113. #define SCROLL_INTERTIA_STEP1 6
  114. #define SCROLL_INTERTIA_STEP2 8
  115. //#define SHORT_ROUND( x ) ( (INT16)( ( x * 1000 ) / 1000 ) )
  116. #define SHORT_ROUND( x ) ( x )
  117. #define NUM_ITEM_CYCLE_COLORS 60
  118. UINT16 us16BPPItemCycleWhiteColors[ NUM_ITEM_CYCLE_COLORS ];
  119. UINT16 us16BPPItemCycleRedColors[ NUM_ITEM_CYCLE_COLORS ];
  120. UINT16 us16BPPItemCycleYellowColors[ NUM_ITEM_CYCLE_COLORS ];
  121. INT16 gsLobOutline;
  122. INT16 gsThrowOutline;
  123. INT16 gsGiveOutline;
  124. INT16 gusNormalItemOutlineColor;
  125. INT16 gusYellowItemOutlineColor;
  126. INT16 gsRenderHeight = 0;
  127. BOOLEAN gfRenderFullThisFrame = 0;
  128. //UINT8 gubIntTileCheckFlags = INTILE_CHECK_FULL;
  129. UINT8 gubIntTileCheckFlags = INTILE_CHECK_SELECTIVE;
  130. UINT8 ubRGBItemCycleWhiteColors[] =
  131. {
  132. 25, 25, 25,
  133. 50, 50, 50,
  134. 75, 75, 75,
  135. 100, 100, 100,
  136. 125, 125, 125,
  137. 150, 150, 150,
  138. 175, 175, 175,
  139. 200, 200, 200,
  140. 225, 225, 225,
  141. 250, 250, 250,
  142. 250, 250, 250,
  143. 225, 225, 225,
  144. 200, 200, 200,
  145. 175, 175, 175,
  146. 150, 150, 150,
  147. 125, 125, 125,
  148. 100, 100, 100,
  149. 75, 75, 75,
  150. 50, 50, 50,
  151. 25, 25, 25,
  152. 25, 25, 25,
  153. 50, 50, 50,
  154. 75, 75, 75,
  155. 100, 100, 100,
  156. 125, 125, 125,
  157. 150, 150, 150,
  158. 175, 175, 175,
  159. 200, 200, 200,
  160. 225, 225, 225,
  161. 250, 250, 250,
  162. 250, 250, 250,
  163. 225, 225, 225,
  164. 200, 200, 200,
  165. 175, 175, 175,
  166. 150, 150, 150,
  167. 125, 125, 125,
  168. 100, 100, 100,
  169. 75, 75, 75,
  170. 50, 50, 50,
  171. 25, 25, 25,
  172. 25, 25, 25,
  173. 50, 50, 50,
  174. 75, 75, 75,
  175. 100, 100, 100,
  176. 125, 125, 125,
  177. 150, 150, 150,
  178. 175, 175, 175,
  179. 200, 200, 200,
  180. 225, 225, 225,
  181. 250, 250, 250,
  182. 250, 250, 250,
  183. 225, 225, 225,
  184. 200, 200, 200,
  185. 175, 175, 175,
  186. 150, 150, 150,
  187. 125, 125, 125,
  188. 100, 100, 100,
  189. 75, 75, 75,
  190. 50, 50, 50,
  191. 25, 25, 25
  192. };
  193. UINT8 ubRGBItemCycleRedColors[] =
  194. {
  195. 25, 0, 0,
  196. 50, 0, 0,
  197. 75, 0, 0,
  198. 100, 0, 0,
  199. 125, 0, 0,
  200. 150, 0, 0,
  201. 175, 0, 0,
  202. 200, 0, 0,
  203. 225, 0, 0,
  204. 250, 0, 0,
  205. 250, 0, 0,
  206. 225, 0, 0,
  207. 200, 0, 0,
  208. 175, 0, 0,
  209. 150, 0, 0,
  210. 125, 0, 0,
  211. 100, 0, 0,
  212. 75, 0, 0,
  213. 50, 0, 0,
  214. 25, 0, 0,
  215. 25, 0, 0,
  216. 50, 0, 0,
  217. 75, 0, 0,
  218. 100, 0, 0,
  219. 125, 0, 0,
  220. 150, 0, 0,
  221. 175, 0, 0,
  222. 200, 0, 0,
  223. 225, 0, 0,
  224. 250, 0, 0,
  225. 250, 0, 0,
  226. 225, 0, 0,
  227. 200, 0, 0,
  228. 175, 0, 0,
  229. 150, 0, 0,
  230. 125, 0, 0,
  231. 100, 0, 0,
  232. 75, 0, 0,
  233. 50, 0, 0,
  234. 25, 0, 0,
  235. 25, 0, 0,
  236. 50, 0, 0,
  237. 75, 0, 0,
  238. 100, 0, 0,
  239. 125, 0, 0,
  240. 150, 0, 0,
  241. 175, 0, 0,
  242. 200, 0, 0,
  243. 225, 0, 0,
  244. 250, 0, 0,
  245. 250, 0, 0,
  246. 225, 0, 0,
  247. 200, 0, 0,
  248. 175, 0, 0,
  249. 150, 0, 0,
  250. 125, 0, 0,
  251. 100, 0, 0,
  252. 75, 0, 0,
  253. 50, 0, 0,
  254. 25, 0, 0,
  255. };
  256. UINT8 ubRGBItemCycleYellowColors[] =
  257. {
  258. 25, 25, 0,
  259. 50, 50, 0,
  260. 75, 75, 0,
  261. 100, 100, 0,
  262. 125, 125, 0,
  263. 150, 150, 0,
  264. 175, 175, 0,
  265. 200, 200, 0,
  266. 225, 225, 0,
  267. 250, 250, 0,
  268. 250, 250, 0,
  269. 225, 225, 0,
  270. 200, 200, 0,
  271. 175, 175, 0,
  272. 150, 150, 0,
  273. 125, 125, 0,
  274. 100, 100, 0,
  275. 75, 75, 0,
  276. 50, 50, 0,
  277. 25, 25, 0,
  278. 25, 25, 0,
  279. 50, 50, 0,
  280. 75, 75, 0,
  281. 100, 100, 0,
  282. 125, 125, 0,
  283. 150, 150, 0,
  284. 175, 175, 0,
  285. 200, 200, 0,
  286. 225, 225, 0,
  287. 250, 250, 0,
  288. 250, 250, 0,
  289. 225, 225, 0,
  290. 200, 200, 0,
  291. 175, 175, 0,
  292. 150, 150, 0,
  293. 125, 125, 0,
  294. 100, 100, 0,
  295. 75, 75, 0,
  296. 50, 50, 0,
  297. 25, 25, 0,
  298. 25, 25, 0,
  299. 50, 50, 0,
  300. 75, 75, 0,
  301. 100, 100, 0,
  302. 125, 125, 0,
  303. 150, 150, 0,
  304. 175, 175, 0,
  305. 200, 200, 0,
  306. 225, 225, 0,
  307. 250, 250, 0,
  308. 250, 250, 0,
  309. 225, 225, 0,
  310. 200, 200, 0,
  311. 175, 175, 0,
  312. 150, 150, 0,
  313. 125, 125, 0,
  314. 100, 100, 0,
  315. 75, 75, 0,
  316. 50, 50, 0,
  317. 25, 25, 0,
  318. };
  319. #define NUMSPEEDS 5
  320. UINT8 gubNewScrollXSpeeds[2][ NUMSPEEDS ] =
  321. {
  322. 40, 80, 100, 180, 200, // Non-video mode scroll
  323. 20, 40, 80, 80, 80 // Video mode scroll
  324. };
  325. UINT8 gubNewScrollYSpeeds[2][ NUMSPEEDS ] =
  326. {
  327. 40, 80, 100, 180, 200, // Non-video mode scroll
  328. 10, 20, 60, 80, 80 // Video mode scroll
  329. };
  330. // These speeds are only an indication of how long to do each subtile step until moving on to another
  331. UINT8 gubNewScrollIDSpeeds[ ] = { 10, 10, 20, 20, 20 };
  332. UINT8 gubScrollSpeedStartID = 2;
  333. UINT8 gubScrollSpeedEndID = 4;
  334. UINT8 gubCurScrollSpeedID = 1;
  335. BOOLEAN gfDoVideoScroll = TRUE;
  336. BOOLEAN gfDoSubtileScroll = FALSE;
  337. BOOLEAN gfScrollPending = FALSE;
  338. UINT32 uiLayerUsedFlags=0xffffffff;
  339. UINT32 uiAdditiveLayerUsedFlags=0xffffffff;
  340. // Array of shade values to use.....
  341. #define NUM_GLOW_FRAMES 30
  342. #if 0
  343. INT16 gsGlowFrames[] =
  344. {
  345. 0,
  346. 0,
  347. 0,
  348. 0,
  349. 0,
  350. 0,
  351. 0,
  352. 0,
  353. 0,
  354. 0,
  355. 0,
  356. 1,
  357. 2,
  358. 3,
  359. 4,
  360. 5,
  361. 6,
  362. 7,
  363. 8,
  364. 9,
  365. 9,
  366. 8,
  367. 7,
  368. 6,
  369. 5,
  370. 4,
  371. 3,
  372. 2,
  373. 1,
  374. 0,
  375. };
  376. #endif
  377. INT16 gsGlowFrames[] =
  378. {
  379. 0,
  380. 0,
  381. 0,
  382. 0,
  383. 0,
  384. 0,
  385. 0,
  386. 0,
  387. 0,
  388. 0,
  389. 0,
  390. 0,
  391. 0,
  392. 0,
  393. 0,
  394. 0,
  395. 0,
  396. 0,
  397. 0,
  398. 0,
  399. 2,
  400. 4,
  401. 6,
  402. 8,
  403. 9,
  404. 8,
  405. 6,
  406. 4,
  407. 2,
  408. 0,
  409. };
  410. // This has to be the same # of frames as NUM_GLOW_FRAMES
  411. INT16 gsFastGlowFrames[] =
  412. {
  413. 0,
  414. 0,
  415. 6,
  416. 7,
  417. 8,
  418. 9,
  419. 8,
  420. 7,
  421. 6,
  422. 5,
  423. 0,
  424. 0,
  425. 6,
  426. 7,
  427. 8,
  428. 9,
  429. 8,
  430. 7,
  431. 6,
  432. 5,
  433. 0,
  434. 0,
  435. 6,
  436. 7,
  437. 8,
  438. 9,
  439. 8,
  440. 7,
  441. 6,
  442. 5,
  443. };
  444. // The glow frame pointer can be adjusted to use a faster/ slower glow
  445. INT16 *gpGlowFramePointer = gsGlowFrames;
  446. UINT32 gScrollDirectionFlags[ NUM_WORLD_DIRECTIONS ] =
  447. {
  448. SCROLL_UP | SCROLL_RIGHT,
  449. SCROLL_RIGHT,
  450. SCROLL_DOWN | SCROLL_RIGHT,
  451. SCROLL_DOWN,
  452. SCROLL_DOWN | SCROLL_LEFT,
  453. SCROLL_LEFT,
  454. SCROLL_UP | SCROLL_LEFT,
  455. SCROLL_UP,
  456. };
  457. INT16 SCROLL_X_STEP = ( WORLD_TILE_X );
  458. INT16 SCROLL_Y_STEP = ( WORLD_TILE_Y * 2);
  459. INT16 gsVIEWPORT_START_X = 0;
  460. INT16 gsVIEWPORT_START_Y = 0;
  461. INT16 gsVIEWPORT_END_Y = 360;
  462. INT16 gsVIEWPORT_WINDOW_END_Y = 360;
  463. INT16 gsVIEWPORT_WINDOW_START_Y = 0;
  464. INT16 gsVIEWPORT_END_X = 640;
  465. INT16 gsTopLeftWorldX, gsTopLeftWorldY;
  466. INT16 gsTopRightWorldX, gsTopRightWorldY;
  467. INT16 gsBottomLeftWorldX, gsBottomLeftWorldY;
  468. INT16 gsBottomRightWorldX, gsBottomRightWorldY;
  469. BOOLEAN gfIgnoreScrolling = FALSE;
  470. BOOLEAN gfIgnoreScrollDueToCenterAdjust = FALSE;
  471. // GLOBAL SCROLLING PARAMS
  472. INT16 gTopLeftWorldLimitX, gTopLeftWorldLimitY;
  473. INT16 gTopRightWorldLimitX, gTopRightWorldLimitY;
  474. INT16 gBottomLeftWorldLimitX, gBottomLeftWorldLimitY;
  475. INT16 gBottomRightWorldLimitX, gBottomRightWorldLimitY;
  476. INT16 Slide, gCenterWorldY;
  477. INT16 gsTLX, gsTLY, gsTRX, gsTRY;
  478. INT16 gsBLX, gsBLY, gsBRX, gsBRY;
  479. INT16 gsCX, gsCY;
  480. DOUBLE gdScaleX, gdScaleY;
  481. #define FASTMAPROWCOLTOPOS( r, c ) ( (r) * WORLD_COLS + (c) )
  482. BOOLEAN gfScrollInertia = FALSE;
  483. // GLOBALS FOR CALCULATING STARTING PARAMETERS
  484. INT16 gsStartPointX_W, gsStartPointY_W;
  485. INT16 gsStartPointX_S, gsStartPointY_S;
  486. INT16 gsStartPointX_M, gsStartPointY_M;
  487. INT16 gsEndXS, gsEndYS;
  488. // LARGER OFFSET VERSION FOR GIVEN LAYERS
  489. INT16 gsLStartPointX_W, gsLStartPointY_W;
  490. INT16 gsLStartPointX_S, gsLStartPointY_S;
  491. INT16 gsLStartPointX_M, gsLStartPointY_M;
  492. INT16 gsLEndXS, gsLEndYS;
  493. BOOLEAN gfRenderScroll = FALSE;
  494. BOOLEAN gfScrollStart = FALSE;
  495. INT16 gsScrollXIncrement;
  496. INT16 gsScrollYIncrement;
  497. INT32 guiScrollDirection;
  498. // Rendering flags (full, partial, etc.)
  499. UINT32 gRenderFlags=0;
  500. SGPRect gClippingRect = { 0, 0, 640, 360};
  501. SGPRect gOldClipRect;
  502. INT16 gsRenderCenterX;
  503. INT16 gsRenderCenterY;
  504. INT16 gsRenderWorldOffsetX = -1;
  505. INT16 gsRenderWorldOffsetY = -1;
  506. SGPRect gSelectRegion;
  507. UINT32 fSelectMode = NO_SELECT;
  508. SGPPoint gSelectAnchor;
  509. typedef struct
  510. {
  511. BOOLEAN fDynamic;
  512. BOOLEAN fZWrite;
  513. BOOLEAN fZBlitter;
  514. BOOLEAN fShadowBlitter;
  515. BOOLEAN fLinkedListDirection;
  516. BOOLEAN fMerc;
  517. BOOLEAN fCheckForRedundency;
  518. BOOLEAN fMultiZBlitter;
  519. BOOLEAN fConvertTo16;
  520. BOOLEAN fObscured;
  521. } RenderFXType;
  522. RenderFXType RenderFX[] =
  523. {
  524. FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, // STATIC LAND
  525. FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, // STATIC OBJECTS
  526. FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC SHADOWS
  527. FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, // STATIC STRUCTS
  528. FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC ROOF
  529. FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, // STATIC ONROOF
  530. FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // STATIC TOPMOST
  531. TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, // DYNAMIC LAND
  532. TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, // DYNAMIC OBJECT
  533. TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC SHADOW
  534. TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC STRUCT MERCS
  535. TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC MERCS
  536. TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC STRUCT
  537. TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC ROOF
  538. TRUE, FALSE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC HIGHMERCS
  539. TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, // DYNAMIC ONROOF
  540. TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE // DYNAMIC TOPMOST
  541. };
  542. UINT8 RenderFXStartIndex[] =
  543. {
  544. LAND_START_INDEX, // STATIC LAND
  545. OBJECT_START_INDEX, // STATIC OBJECTS
  546. SHADOW_START_INDEX, // STATIC SHADOWS
  547. STRUCT_START_INDEX, // STATIC STRUCTS
  548. ROOF_START_INDEX, // STATIC ROOF
  549. ONROOF_START_INDEX, // STATIC ONROOF
  550. TOPMOST_START_INDEX, // STATIC TOPMOST
  551. LAND_START_INDEX, // DYNAMIC LAND
  552. OBJECT_START_INDEX, // DYNAMIC OBJECT
  553. SHADOW_START_INDEX, // DYNAMIC SHADOW
  554. MERC_START_INDEX, // DYNAMIC STRUCT MERCS
  555. MERC_START_INDEX, // DYNAMIC MERCS
  556. STRUCT_START_INDEX, // DYNAMIC STRUCT
  557. ROOF_START_INDEX, // DYNAMIC ROOF
  558. MERC_START_INDEX, // DYNAMIC HIGHMERCS
  559. ONROOF_START_INDEX, // DYNAMIC ONROOF
  560. TOPMOST_START_INDEX, // DYNAMIC TOPMOST
  561. };
  562. //INT16 gsCoordArray[ 500 ][ 500 ][ 4 ];
  563. //INT16 gsCoordArrayX;
  564. //INT16 gsCoordArrayY;
  565. //void SetRenderGlobals( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  566. //void TempRenderTiles(UINT32 uiFlags, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  567. //void TempRenderTiles(UINT32 uiFlags, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS, UINT8 ubNumLevels, UINT32 *puiLevels );
  568. void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  569. //void ReRenderWorld(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom);
  570. void ClearMarkedTiles(void);
  571. void CorrectRenderCenter( INT16 sRenderX, INT16 sRenderY, INT16 *pSNewX, INT16 *pSNewY );
  572. void ScrollBackground(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScrollYIncrement );
  573. void CalcRenderParameters(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom );
  574. void ResetRenderParameters( );
  575. BOOLEAN Zero8BPPDataTo16BPPBufferTransparent( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex );
  576. BOOLEAN Blt8BPPDataTo16BPPBufferTransInvZ( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex );
  577. BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette );
  578. BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion);
  579. BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette );
  580. BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion);
  581. void RenderRoomInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  582. #ifdef _DEBUG
  583. extern UINT8 gubFOVDebugInfoInfo[ WORLD_MAX ];
  584. extern UINT8 gubGridNoMarkers[ WORLD_MAX ];
  585. extern UINT8 gubGridNoValue;
  586. extern BOOLEAN gfDisplayCoverValues;
  587. extern BOOLEAN gfDisplayGridNoVisibleValues = 0;
  588. extern INT16 gsCoverValue[ WORLD_MAX ];
  589. extern INT16 gsBestCover;
  590. void RenderFOVDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  591. void RenderCoverDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  592. void RenderGridNoVisibleDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  593. #endif
  594. void DeleteFromWorld( UINT16 usTileIndex, UINT32 uiRenderTiles, UINT16 usIndex );
  595. void RenderHighlight( INT16 sMouseX_M, INT16 sMouseY_M, INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS );
  596. BOOLEAN CheckRenderCenter( INT16 sNewCenterX, INT16 sNewCenterY );
  597. BOOLEAN RevealWalls(INT16 sX, INT16 sY, INT16 sRadius)
  598. {
  599. LEVELNODE *pStruct;
  600. INT16 sCountX, sCountY;
  601. UINT32 uiTile;
  602. BOOLEAN fRerender=FALSE;
  603. TILE_ELEMENT *TileElem;
  604. for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
  605. for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
  606. {
  607. uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
  608. pStruct=gpWorldLevelData[uiTile].pStructHead;
  609. while(pStruct!=NULL)
  610. {
  611. TileElem = &(gTileDatabase[pStruct->usIndex]);
  612. switch(TileElem->usWallOrientation)
  613. {
  614. case NO_ORIENTATION:
  615. break;
  616. case INSIDE_TOP_RIGHT:
  617. case OUTSIDE_TOP_RIGHT:
  618. if(sCountX >= sX)
  619. {
  620. pStruct->uiFlags|=LEVELNODE_REVEAL;
  621. fRerender=TRUE;
  622. }
  623. break;
  624. case INSIDE_TOP_LEFT:
  625. case OUTSIDE_TOP_LEFT:
  626. if(sCountY >= sY)
  627. {
  628. pStruct->uiFlags|=LEVELNODE_REVEAL;
  629. fRerender=TRUE;
  630. }
  631. break;
  632. }
  633. pStruct=pStruct->pNext;
  634. }
  635. }
  636. /*
  637. if(fRerender)
  638. SetRenderFlags(RENDER_FLAG_FULL);
  639. */
  640. return(TRUE);
  641. }
  642. BOOLEAN ConcealWalls(INT16 sX, INT16 sY, INT16 sRadius)
  643. {
  644. LEVELNODE *pStruct;
  645. INT16 sCountX, sCountY;
  646. UINT32 uiTile;
  647. BOOLEAN fRerender=FALSE;
  648. TILE_ELEMENT *TileElem;
  649. for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
  650. for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
  651. {
  652. uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
  653. pStruct=gpWorldLevelData[uiTile].pStructHead;
  654. while(pStruct!=NULL)
  655. {
  656. TileElem = &(gTileDatabase[pStruct->usIndex]);
  657. switch(TileElem->usWallOrientation)
  658. {
  659. case NO_ORIENTATION:
  660. break;
  661. case INSIDE_TOP_RIGHT:
  662. case OUTSIDE_TOP_RIGHT:
  663. if(sCountX >= sX)
  664. {
  665. pStruct->uiFlags&=(~LEVELNODE_REVEAL);
  666. fRerender=TRUE;
  667. }
  668. break;
  669. case INSIDE_TOP_LEFT:
  670. case OUTSIDE_TOP_LEFT:
  671. if(sCountY >= sY)
  672. {
  673. pStruct->uiFlags&=(~LEVELNODE_REVEAL);
  674. fRerender=TRUE;
  675. }
  676. break;
  677. }
  678. pStruct=pStruct->pNext;
  679. }
  680. }
  681. /*
  682. if(fRerender)
  683. SetRenderFlags(RENDER_FLAG_FULL);
  684. */
  685. return(TRUE);
  686. }
  687. void ConcealAllWalls(void)
  688. {
  689. LEVELNODE *pStruct;
  690. UINT32 uiCount;
  691. for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
  692. {
  693. pStruct=gpWorldLevelData[uiCount].pStructHead;
  694. while(pStruct!=NULL)
  695. {
  696. pStruct->uiFlags&=(~LEVELNODE_REVEAL);
  697. pStruct=pStruct->pNext;
  698. }
  699. }
  700. }
  701. void ResetLayerOptimizing(void)
  702. {
  703. uiLayerUsedFlags = 0xffffffff;
  704. uiAdditiveLayerUsedFlags = 0;
  705. }
  706. void ResetSpecificLayerOptimizing( UINT32 uiRowFlag )
  707. {
  708. uiLayerUsedFlags |= uiRowFlag;
  709. }
  710. void SumAddiviveLayerOptimization( void )
  711. {
  712. uiLayerUsedFlags = uiAdditiveLayerUsedFlags;
  713. }
  714. void SetRenderFlags(UINT32 uiFlags)
  715. {
  716. gRenderFlags|=uiFlags;
  717. }
  718. void ClearRenderFlags(UINT32 uiFlags)
  719. {
  720. gRenderFlags&=(~uiFlags);
  721. }
  722. UINT32 GetRenderFlags(void)
  723. {
  724. return(gRenderFlags);
  725. }
  726. void RenderSetShadows(BOOLEAN fShadows)
  727. {
  728. if(fShadows)
  729. gRenderFlags|=RENDER_FLAG_SHADOWS;
  730. else
  731. gRenderFlags&=(~RENDER_FLAG_SHADOWS);
  732. }
  733. 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 )
  734. {
  735. //#if 0
  736. LEVELNODE *pNode; //, *pLand, *pStruct; //*pObject, *pTopmost, *pMerc;
  737. SOLDIERTYPE *pSoldier, *pSelSoldier;
  738. HVOBJECT hVObject;
  739. ETRLEObject *pTrav;
  740. TILE_ELEMENT *TileElem=NULL;
  741. UINT32 uiDestPitchBYTES;
  742. UINT8 *pDestBuf=NULL;
  743. UINT16 usAnimSurface;
  744. INT8 bXOddFlag = 0;
  745. INT32 iAnchorPosX_M, iAnchorPosY_M;
  746. INT32 iAnchorPosX_S, iAnchorPosY_S;
  747. INT32 iTempPosX_M, iTempPosY_M;
  748. INT32 iTempPosX_S, iTempPosY_S;
  749. FLOAT dOffsetX, dOffsetY;
  750. FLOAT dTempX_S, dTempY_S;
  751. UINT32 uiTileIndex;
  752. UINT16 usImageIndex, *pShadeTable, *pDirtyBackPtr;
  753. UINT32 uiBrushWidth, uiBrushHeight, uiDirtyFlags;
  754. INT16 sTileHeight, sXPos, sYPos, sZLevel;
  755. INT16 sMouseX_M, sMouseY_M;
  756. BOOLEAN fShadowBlitter=FALSE;
  757. BOOLEAN fZBlitter=FALSE;
  758. BOOLEAN fZWrite=FALSE;
  759. BOOLEAN fLinkedListDirection=TRUE;
  760. BOOLEAN fRenderTile=TRUE;
  761. BOOLEAN fMerc=FALSE;
  762. BOOLEAN fCheckForRedundency=FALSE;
  763. UINT32 uiRowFlags;
  764. BOOLEAN fDynamic=TRUE;
  765. BOOLEAN fEndRenderRow = FALSE;
  766. BOOLEAN fEndRenderCol = FALSE;
  767. BOOLEAN fPixelate=FALSE;
  768. BOOLEAN fMultiZBlitter = FALSE;
  769. BOOLEAN fWallTile = FALSE;
  770. BOOLEAN fMultiTransShadowZBlitter = FALSE;
  771. INT16 sMultiTransShadowZBlitterIndex=-1;
  772. BOOLEAN fTranslucencyType=FALSE;
  773. INT16 sX, sY;
  774. BOOLEAN fTileInvisible = FALSE;
  775. BOOLEAN fConvertTo16=FALSE;
  776. BOOLEAN fBlit16=FALSE;
  777. UINT32 cnt;
  778. static UINT8 ubLevelNodeStartIndex[ NUM_RENDER_FX_TYPES ];
  779. BOOLEAN bItemOutline;
  780. UINT16 usOutlineColor=0;
  781. static INT32 iTileMapPos[ 500 ];
  782. UINT32 uiMapPosIndex;
  783. UINT8 bBlitClipVal;
  784. INT8 bItemCount, bVisibleItemCount;
  785. //UINT16 us16BPPIndex;
  786. RenderFXType RenderingFX;
  787. BOOLEAN fCheckForMouseDetections = FALSE;
  788. static RenderFXType RenderFXList[ NUM_RENDER_FX_TYPES ];
  789. BOOLEAN fSaveZ;
  790. INT16 sWorldY;
  791. INT16 sZOffsetX=-1;
  792. INT16 sZOffsetY=-1;
  793. BOOLEAN fIntensityBlitter;
  794. INT16 gsForceSoldierZLevel;
  795. ROTTING_CORPSE *pCorpse=NULL;
  796. BOOLEAN fUseTileElem;
  797. UINT32 uiLevelNodeFlags;
  798. UINT32 uiTileElemFlags=0;
  799. INT8 bGlowShadeOffset;
  800. BOOLEAN fObscured;
  801. BOOLEAN fObscuredBlitter;
  802. INT16 sModifiedTileHeight;
  803. BOOLEAN fDoRow;
  804. INT16 **pShadeStart;
  805. UINT32 uiSaveBufferPitchBYTES;
  806. UINT8 *pSaveBuf;
  807. ITEM_POOL *pItemPool = NULL;
  808. BOOLEAN fHiddenTile = FALSE;
  809. UINT32 uiAniTileFlags = 0;
  810. //Init some variables
  811. usImageIndex = 0;
  812. sZLevel = 0;
  813. uiDirtyFlags = 0;
  814. pShadeTable = NULL;
  815. // Begin Render Loop
  816. iAnchorPosX_M = iStartPointX_M;
  817. iAnchorPosY_M = iStartPointY_M;
  818. iAnchorPosX_S = iStartPointX_S;
  819. iAnchorPosY_S = iStartPointY_S;
  820. if(!(uiFlags&TILES_DIRTY))
  821. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  822. if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
  823. {
  824. if ( ShouldCheckForMouseDetections( ) )
  825. {
  826. BeginCurInteractiveTileCheck( gubIntTileCheckFlags );
  827. fCheckForMouseDetections = TRUE;
  828. // If we are in edit mode, don't do this...
  829. if ( gfEditMode )
  830. {
  831. fCheckForMouseDetections = FALSE;
  832. }
  833. }
  834. }
  835. //if((uiFlags&TILES_TYPE_MASK)==TILES_STATIC_LAND)
  836. GetMouseXY( &sMouseX_M, &sMouseY_M );
  837. pDirtyBackPtr=NULL;
  838. if(gTacticalStatus.uiFlags&TRANSLUCENCY_TYPE)
  839. fTranslucencyType=TRUE;
  840. for ( cnt = 0; cnt < ubNumLevels; cnt++ )
  841. {
  842. ubLevelNodeStartIndex[ cnt ] = RenderFXStartIndex[ psLevelIDs[ cnt ] ];
  843. RenderFXList[ cnt ] = RenderFX[ psLevelIDs[ cnt ] ];
  844. }
  845. do
  846. {
  847. iTempPosX_M = iAnchorPosX_M;
  848. iTempPosY_M = iAnchorPosY_M;
  849. iTempPosX_S = iAnchorPosX_S;
  850. iTempPosY_S = iAnchorPosY_S;
  851. uiMapPosIndex = 0;
  852. // Build tile index list
  853. do
  854. {
  855. iTileMapPos[ uiMapPosIndex ] = FASTMAPROWCOLTOPOS( iTempPosY_M, iTempPosX_M );
  856. iTempPosX_S += 40;
  857. iTempPosX_M ++;
  858. iTempPosY_M --;
  859. uiMapPosIndex++;
  860. } while( iTempPosX_S < iEndXS );
  861. for ( cnt = 0; cnt < ubNumLevels; cnt++ )
  862. {
  863. uiRowFlags = puiLevels[ cnt ];
  864. fDoRow = TRUE;
  865. if ( ( uiRowFlags & TILES_ALL_DYNAMICS ) && !( uiLayerUsedFlags & uiRowFlags ) && !( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE ) )
  866. {
  867. fDoRow = FALSE;
  868. }
  869. if ( fDoRow )
  870. {
  871. iTempPosX_M = iAnchorPosX_M;
  872. iTempPosY_M = iAnchorPosY_M;
  873. iTempPosX_S = iAnchorPosX_S;
  874. iTempPosY_S = iAnchorPosY_S;
  875. fEndRenderRow = FALSE;
  876. uiMapPosIndex = 0;
  877. if(bXOddFlag > 0)
  878. iTempPosX_S += 20;
  879. do
  880. {
  881. uiTileIndex = iTileMapPos[ uiMapPosIndex ];
  882. uiMapPosIndex++;
  883. //if ( 0 )
  884. if ( uiTileIndex < GRIDSIZE )
  885. {
  886. // OK, we're sreaching through this loop anyway, might as well check for mouse position
  887. // over objects...
  888. // Experimental!
  889. if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
  890. {
  891. if ( fCheckForMouseDetections && gpWorldLevelData[uiTileIndex].pStructHead != NULL )
  892. {
  893. LogMouseOverInteractiveTile( (INT16)uiTileIndex );
  894. }
  895. }
  896. if((uiFlags&TILES_MARKED) && !(gpWorldLevelData[uiTileIndex].uiFlags&MAPELEMENT_REDRAW))
  897. {
  898. pNode=NULL;
  899. }
  900. else
  901. {
  902. //pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ RenderFXStartIndex[ psLevelIDs[ cnt ] ] ];
  903. //pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ 0 ];
  904. //pNode=NULL;
  905. pNode = gpWorldLevelData[ uiTileIndex ].pLevelNodes[ ubLevelNodeStartIndex[ cnt ] ];
  906. }
  907. bItemCount = 0;
  908. bVisibleItemCount = 0;
  909. pItemPool = NULL;
  910. while(pNode!= NULL)
  911. {
  912. RenderingFX = RenderFXList[ cnt ];
  913. fObscured = RenderingFX.fObscured;
  914. fDynamic = RenderingFX.fDynamic;
  915. fMerc = RenderingFX.fMerc;
  916. fZWrite = RenderingFX.fZWrite;
  917. fZBlitter = RenderingFX.fZBlitter;
  918. fShadowBlitter = RenderingFX.fShadowBlitter;
  919. fLinkedListDirection = RenderingFX.fLinkedListDirection;
  920. fCheckForRedundency = RenderingFX.fCheckForRedundency;
  921. fMultiZBlitter = RenderingFX.fMultiZBlitter;
  922. fConvertTo16 = RenderingFX.fConvertTo16;
  923. fIntensityBlitter = FALSE;
  924. fSaveZ = FALSE;
  925. fWallTile = FALSE;
  926. gsForceSoldierZLevel = FALSE;
  927. pSoldier = NULL;
  928. fUseTileElem = FALSE;
  929. fMultiTransShadowZBlitter = FALSE;
  930. fObscuredBlitter = FALSE;
  931. fTranslucencyType = TRUE;
  932. uiAniTileFlags = 0;
  933. uiLevelNodeFlags = pNode->uiFlags;
  934. if ( fCheckForRedundency )
  935. {
  936. if ( ( gpWorldLevelData[ uiTileIndex ].uiFlags & MAPELEMENT_REDUNDENT) )
  937. {
  938. // IF WE DONOT WANT TO RE-EVALUATE FIRST
  939. if ( !( gpWorldLevelData[uiTileIndex].uiFlags & MAPELEMENT_REEVALUATE_REDUNDENCY ) && !(gTacticalStatus.uiFlags & NOHIDE_REDUNDENCY ) )
  940. {
  941. pNode = NULL;
  942. break;
  943. }
  944. }
  945. }
  946. // Force z-buffer blitting for marked tiles ( even ground!)
  947. if ( (uiFlags&TILES_MARKED) )
  948. {
  949. fZBlitter = TRUE;
  950. }
  951. //Looking up height every time here is alot better than doing it above!
  952. sTileHeight=gpWorldLevelData[uiTileIndex].sHeight;
  953. sModifiedTileHeight = ( ( ( sTileHeight / 80 ) - 1 ) * 80 );
  954. if ( sModifiedTileHeight < 0 )
  955. {
  956. sModifiedTileHeight = 0;
  957. }
  958. fRenderTile=TRUE;
  959. pDirtyBackPtr=NULL;
  960. if(uiLevelNodeFlags&LEVELNODE_REVEAL)
  961. {
  962. if(!fDynamic)
  963. fRenderTile=FALSE;
  964. else
  965. fPixelate=TRUE;
  966. }
  967. else
  968. fPixelate=FALSE;
  969. // non-type specific setup
  970. sXPos = (INT16)iTempPosX_S;
  971. sYPos = (INT16)iTempPosY_S;
  972. // setup for any tile type except mercs
  973. if(!fMerc )
  974. {
  975. if ( !( uiLevelNodeFlags & ( LEVELNODE_ROTTINGCORPSE | LEVELNODE_CACHEDANITILE ) ) )
  976. {
  977. if( ( uiLevelNodeFlags & LEVELNODE_REVEALTREES ) )
  978. {
  979. TileElem = &(gTileDatabase[pNode->usIndex + 2]);
  980. }
  981. else
  982. {
  983. TileElem = &(gTileDatabase[pNode->usIndex]);
  984. }
  985. // HANDLE INDEPENDANT-PER-TILE ANIMATIONS ( IE: DOORS, EXPLODING THINGS, ETC )
  986. if ( fDynamic )
  987. {
  988. if( ( uiLevelNodeFlags & LEVELNODE_ANIMATION ) )
  989. {
  990. if ( pNode->sCurrentFrame != -1 )
  991. {
  992. Assert( TileElem->pAnimData != NULL );
  993. TileElem = &gTileDatabase[TileElem->pAnimData->pusFrames[pNode->sCurrentFrame]];
  994. }
  995. }
  996. }
  997. }
  998. // Check for best translucency
  999. if ( uiLevelNodeFlags & LEVELNODE_USEBESTTRANSTYPE )
  1000. {
  1001. fTranslucencyType = FALSE;
  1002. }
  1003. if ( ( uiLevelNodeFlags & ( LEVELNODE_ROTTINGCORPSE | LEVELNODE_CACHEDANITILE ) ) )
  1004. {
  1005. if ( fDynamic )
  1006. {
  1007. if( !(uiLevelNodeFlags & ( LEVELNODE_DYNAMIC ) ) && !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC) )
  1008. fRenderTile=FALSE;
  1009. }
  1010. else if( (uiLevelNodeFlags & ( LEVELNODE_DYNAMIC ) ) )
  1011. fRenderTile=FALSE;
  1012. }
  1013. else
  1014. {
  1015. // Set Tile elem flags here!
  1016. uiTileElemFlags = TileElem->uiFlags;
  1017. // Set valid tile elem!
  1018. fUseTileElem = TRUE;
  1019. if(fDynamic || fPixelate)
  1020. {
  1021. if(!fPixelate)
  1022. {
  1023. if(!( uiTileElemFlags & ANIMATED_TILE) && !(uiTileElemFlags & DYNAMIC_TILE) && !(uiLevelNodeFlags & LEVELNODE_DYNAMIC) && !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC) )
  1024. fRenderTile=FALSE;
  1025. else if(!(uiTileElemFlags&DYNAMIC_TILE) && !(uiLevelNodeFlags&LEVELNODE_DYNAMIC) && !(uiLevelNodeFlags&LEVELNODE_LASTDYNAMIC) )
  1026. // else if((TileElem->uiFlags&ANIMATED_TILE) )
  1027. {
  1028. Assert( TileElem->pAnimData != NULL );
  1029. TileElem = &gTileDatabase[TileElem->pAnimData->pusFrames[TileElem->pAnimData->bCurrentFrame]];
  1030. uiTileElemFlags = TileElem->uiFlags;
  1031. }
  1032. }
  1033. }
  1034. else if((uiTileElemFlags & ANIMATED_TILE) || (uiTileElemFlags & DYNAMIC_TILE) || (uiLevelNodeFlags & LEVELNODE_DYNAMIC) )
  1035. {
  1036. if ( !( uiFlags & TILES_OBSCURED ) || ( uiTileElemFlags & ANIMATED_TILE ) )
  1037. {
  1038. fRenderTile=FALSE;
  1039. }
  1040. }
  1041. }
  1042. // OK, ATE, CHECK FOR AN OBSCURED TILE AND MAKE SURE IF LEVELNODE IS SET
  1043. // WE DON'T RENDER UNLESS WE HAVE THE RENDER FLAG SET!
  1044. if ( fObscured )
  1045. {
  1046. if ( ( uiFlags & TILES_OBSCURED ) )
  1047. {
  1048. if ( uiLevelNodeFlags & LEVELNODE_SHOW_THROUGH )
  1049. {
  1050. fObscuredBlitter = TRUE;
  1051. // ATE: Check if this is a levelnode, and what frame we are on
  1052. // turn off......
  1053. //if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && gsCurrentItemGlowFrame < 25 )
  1054. //{
  1055. // fRenderTile = FALSE;
  1056. //}
  1057. }
  1058. else
  1059. {
  1060. // Don;t render if we are not on this render loop!
  1061. fRenderTile = FALSE;
  1062. }
  1063. }
  1064. else
  1065. {
  1066. if ( uiLevelNodeFlags & LEVELNODE_SHOW_THROUGH )
  1067. {
  1068. fRenderTile = FALSE;
  1069. // ATE: Check if this is a levelnode, and what frame we are on
  1070. // turn off......
  1071. //if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && gsCurrentItemGlowFrame < 25 )
  1072. //{
  1073. // fRenderTile = TRUE;
  1074. //}
  1075. }
  1076. }
  1077. }
  1078. // If flag says to do dynamic as well, render!
  1079. if ( ( uiFlags & TILES_DOALL ) )
  1080. {
  1081. fRenderTile = TRUE;
  1082. }
  1083. // If we are on the struct layer, check for if it's hidden!
  1084. if ( uiRowFlags & ( TILES_STATIC_STRUCTURES | TILES_DYNAMIC_STRUCTURES | TILES_STATIC_SHADOWS | TILES_DYNAMIC_SHADOWS ) )
  1085. {
  1086. if ( fUseTileElem )
  1087. {
  1088. #if 0
  1089. // DONOT RENDER IF IT'S A HIDDEN STRUCT AND TILE IS NOT REVEALED
  1090. if ( uiTileElemFlags & HIDDEN_TILE )
  1091. {
  1092. // IF WORLD IS NOT REVEALED, QUIT
  1093. #ifdef JA2EDITOR
  1094. if ( !gfEditMode )
  1095. #endif
  1096. {
  1097. if ( !(gpWorldLevelData[ uiTileIndex ].uiFlags & MAPELEMENT_REVEALED ) && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
  1098. {
  1099. //CONTINUE, DONOT RENDER
  1100. if(!fLinkedListDirection)
  1101. pNode = pNode->pPrevNode;
  1102. else
  1103. pNode = pNode->pNext;
  1104. continue;
  1105. }
  1106. }
  1107. }
  1108. #endif
  1109. }
  1110. }
  1111. if(fRenderTile)
  1112. {
  1113. // Set flag to set layer as used
  1114. if( fDynamic || fPixelate )
  1115. {
  1116. uiAdditiveLayerUsedFlags |= uiRowFlags;
  1117. }
  1118. if ( uiLevelNodeFlags & LEVELNODE_DYNAMICZ )
  1119. {
  1120. fSaveZ = TRUE;
  1121. fZWrite = TRUE;
  1122. }
  1123. if ( ( uiLevelNodeFlags & LEVELNODE_CACHEDANITILE ) )
  1124. {
  1125. hVObject = gpTileCache[ pNode->pAniTile->sCachedTileID ].pImagery->vo;
  1126. usImageIndex = pNode->pAniTile->sCurrentFrame;
  1127. uiAniTileFlags = pNode->pAniTile->uiFlags;
  1128. // Position corpse based on it's float position
  1129. if ( ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE ) )
  1130. {
  1131. pCorpse = &( gRottingCorpse[ pNode->pAniTile->uiUserData ] );
  1132. pShadeTable = pCorpse->pShades[ pNode->ubShadeLevel ];
  1133. //pShadeTable = pCorpse->p16BPPPalette;
  1134. dOffsetX = pCorpse->def.dXPos - gsRenderCenterX;
  1135. dOffsetY = pCorpse->def.dYPos - gsRenderCenterY;
  1136. // OK, if this is a corpse.... stop if not visible
  1137. if ( pCorpse->def.bVisible != 1 && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
  1138. {
  1139. //CONTINUE, DONOT RENDER
  1140. if(!fLinkedListDirection)
  1141. pNode = pNode->pPrevNode;
  1142. else
  1143. pNode = pNode->pNext;
  1144. continue;
  1145. }
  1146. }
  1147. else
  1148. {
  1149. dOffsetX = (FLOAT)( pNode->pAniTile->sRelativeX - gsRenderCenterX );
  1150. dOffsetY = (FLOAT)( pNode->pAniTile->sRelativeY - gsRenderCenterY );
  1151. }
  1152. // Calculate guy's position
  1153. FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
  1154. sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)dTempX_S;
  1155. sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)dTempY_S - sTileHeight;
  1156. // Adjust for offset position on screen
  1157. sXPos -= gsRenderWorldOffsetX;
  1158. sYPos -= gsRenderWorldOffsetY;
  1159. }
  1160. else
  1161. {
  1162. hVObject = TileElem->hTileSurface;
  1163. usImageIndex=TileElem->usRegionIndex;
  1164. // ADJUST FOR WORLD MAPELEM HIEGHT
  1165. sYPos-=TileElem->sOffsetHeight;
  1166. if((TileElem->uiFlags&IGNORE_WORLD_HEIGHT) )
  1167. {
  1168. sYPos = sYPos - sModifiedTileHeight;
  1169. //sYPos -= sTileHeight;
  1170. }
  1171. if( !(uiLevelNodeFlags&LEVELNODE_IGNOREHEIGHT) && !(TileElem->uiFlags&IGNORE_WORLD_HEIGHT ))
  1172. sYPos-=sTileHeight;
  1173. if(!(uiFlags&TILES_DIRTY))
  1174. {
  1175. hVObject->pShadeCurrent=hVObject->pShades[pNode->ubShadeLevel];
  1176. hVObject->pShade8=ubColorTables[pNode->ubShadeLevel];
  1177. }
  1178. }
  1179. //ADJUST FOR RELATIVE OFFSETS
  1180. if ( uiLevelNodeFlags & LEVELNODE_USERELPOS )
  1181. {
  1182. sXPos += pNode->sRelativeX;
  1183. sYPos += pNode->sRelativeY;
  1184. }
  1185. if ( uiLevelNodeFlags& LEVELNODE_USEZ )
  1186. {
  1187. sYPos -= pNode->sRelativeZ;
  1188. }
  1189. //ADJUST FOR ABSOLUTE POSITIONING
  1190. if ( uiLevelNodeFlags& LEVELNODE_USEABSOLUTEPOS )
  1191. {
  1192. dOffsetX = (FLOAT)(pNode->sRelativeX - gsRenderCenterX);
  1193. dOffsetY = (FLOAT)(pNode->sRelativeY - gsRenderCenterY);
  1194. // OK, DONT'T ASK... CONVERSION TO PROPER Y NEEDS THIS...
  1195. dOffsetX -= CELL_Y_SIZE;
  1196. FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
  1197. sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)SHORT_ROUND( dTempX_S );
  1198. sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)SHORT_ROUND( dTempY_S );
  1199. // Adjust for offset position on screen
  1200. sXPos -= gsRenderWorldOffsetX;
  1201. sYPos -= gsRenderWorldOffsetY;
  1202. sYPos -= pNode->sRelativeZ;
  1203. }
  1204. }
  1205. // COUNT # OF ITEMS AT THIS LOCATION
  1206. if ( uiLevelNodeFlags & LEVELNODE_ITEM )
  1207. {
  1208. // OK set item pool for this location....
  1209. if ( bItemCount == 0 )
  1210. {
  1211. pItemPool = pNode->pItemPool;
  1212. }
  1213. else
  1214. {
  1215. pItemPool = pItemPool->pNext;
  1216. }
  1217. if ( bItemCount < MAX_RENDERED_ITEMS )
  1218. {
  1219. bItemCount++;
  1220. if ( gWorldItems[ pItemPool->iItemIndex ].bVisible == VISIBLE )
  1221. {
  1222. bVisibleItemCount++;
  1223. }
  1224. }
  1225. // LIMIT RENDERING OF ITEMS TO ABOUT 7, DO NOT RENDER HIDDEN ITEMS TOO!
  1226. if ( bVisibleItemCount == MAX_RENDERED_ITEMS || ( gWorldItems[ pItemPool->iItemIndex ].bVisible != VISIBLE ) || ( pItemPool->usFlags & WORLD_ITEM_DONTRENDER ) )
  1227. {
  1228. if ( !(gTacticalStatus.uiFlags&SHOW_ALL_ITEMS) )
  1229. {
  1230. //CONTINUE, DONOT RENDER
  1231. if(!fLinkedListDirection)
  1232. pNode = pNode->pPrevNode;
  1233. else
  1234. pNode = pNode->pNext;
  1235. continue;
  1236. }
  1237. }
  1238. if ( pItemPool->bRenderZHeightAboveLevel > 0 )
  1239. {
  1240. sYPos -= pItemPool->bRenderZHeightAboveLevel;
  1241. }
  1242. }
  1243. // If render tile is false...
  1244. if ( !fRenderTile )
  1245. {
  1246. if(!fLinkedListDirection)
  1247. pNode = pNode->pPrevNode;
  1248. else
  1249. pNode = pNode->pNext;
  1250. continue;
  1251. }
  1252. }
  1253. // specific code for node types on a per-tile basis
  1254. switch( uiRowFlags )
  1255. {
  1256. case TILES_STATIC_LAND:
  1257. LandZLevel( iTempPosX_M, iTempPosY_M );
  1258. break;
  1259. case TILES_STATIC_OBJECTS:
  1260. // ATE: Modified to use constant z level, as these are same level as land items
  1261. ObjectZLevel( TileElem, pNode, iTempPosX_M, iTempPosY_M );
  1262. break;
  1263. case TILES_STATIC_STRUCTURES:
  1264. StructZLevel( iTempPosX_M, iTempPosY_M );
  1265. if ( fUseTileElem && ( TileElem->uiFlags & MULTI_Z_TILE ) )
  1266. {
  1267. fMultiZBlitter = TRUE;
  1268. }
  1269. // ATE: if we are a wall, set flag
  1270. if ( fUseTileElem && ( TileElem->uiFlags & WALL_TILE ) )
  1271. {
  1272. fWallTile = TRUE;
  1273. }
  1274. break;
  1275. case TILES_STATIC_ROOF:
  1276. RoofZLevel( iTempPosX_M, iTempPosY_M );
  1277. // Automatically adjust height!
  1278. sYPos -= WALL_HEIGHT;
  1279. // ATE: Added for shadows on roofs
  1280. if ( fUseTileElem && ( TileElem->uiFlags & ROOFSHADOW_TILE ) )
  1281. {
  1282. fShadowBlitter=TRUE;
  1283. }
  1284. break;
  1285. case TILES_STATIC_ONROOF:
  1286. OnRoofZLevel( iTempPosX_M, iTempPosY_M );
  1287. // Automatically adjust height!
  1288. sYPos -= WALL_HEIGHT;
  1289. break;
  1290. case TILES_STATIC_TOPMOST:
  1291. TopmostZLevel( iTempPosX_M, iTempPosY_M );
  1292. break;
  1293. case TILES_STATIC_SHADOWS:
  1294. ShadowZLevel( iTempPosX_M, iTempPosY_M );
  1295. if ( uiLevelNodeFlags & LEVELNODE_EXITGRID )
  1296. {
  1297. fIntensityBlitter = TRUE;
  1298. fShadowBlitter = FALSE;
  1299. }
  1300. break;
  1301. case TILES_DYNAMIC_LAND:
  1302. LandZLevel( iTempPosX_M, iTempPosY_M );
  1303. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1304. break;
  1305. case TILES_DYNAMIC_SHADOWS:
  1306. ShadowZLevel( iTempPosX_M, iTempPosY_M );
  1307. //sZLevel=SHADOW_Z_LEVEL;
  1308. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1309. break;
  1310. case TILES_DYNAMIC_OBJECTS:
  1311. ObjectZLevel( TileElem, pNode, iTempPosX_M, iTempPosY_M );
  1312. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1313. break;
  1314. case TILES_DYNAMIC_STRUCTURES:
  1315. StructZLevel( iTempPosX_M, iTempPosY_M );
  1316. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1317. break;
  1318. case TILES_DYNAMIC_ROOF:
  1319. sYPos -= WALL_HEIGHT;
  1320. RoofZLevel( iTempPosX_M, iTempPosY_M );
  1321. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1322. // For now, adjust to hieght of a wall ( 50 temp, make define )
  1323. //if ( TileElem->fType > FOOTPRINTS )
  1324. //{
  1325. // sYPos -= 58;
  1326. //}
  1327. break;
  1328. case TILES_DYNAMIC_ONROOF:
  1329. OnRoofZLevel( iTempPosX_M, iTempPosY_M );
  1330. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1331. // Automatically adjust height!
  1332. sYPos -= WALL_HEIGHT;
  1333. break;
  1334. case TILES_DYNAMIC_TOPMOST:
  1335. TopmostZLevel( iTempPosX_M, iTempPosY_M );
  1336. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED;
  1337. break;
  1338. case TILES_DYNAMIC_MERCS:
  1339. case TILES_DYNAMIC_HIGHMERCS:
  1340. case TILES_DYNAMIC_STRUCT_MERCS:
  1341. // Set flag to set layer as used
  1342. uiAdditiveLayerUsedFlags |= uiRowFlags;
  1343. pSoldier=pNode->pSoldier;
  1344. if ( uiRowFlags == TILES_DYNAMIC_MERCS )
  1345. {
  1346. // If we are multi-tiled, ignore here
  1347. if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
  1348. {
  1349. pNode = pNode->pNext;
  1350. continue;
  1351. }
  1352. // If we are at a higher level, no not do anything unless we are at the highmerc stage
  1353. if ( pSoldier->bLevel > 0 )
  1354. {
  1355. pNode = pNode->pNext;
  1356. continue;
  1357. }
  1358. }
  1359. if ( uiRowFlags == TILES_DYNAMIC_HIGHMERCS )
  1360. {
  1361. // If we are multi-tiled, ignore here
  1362. if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
  1363. {
  1364. pNode = pNode->pNext;
  1365. continue;
  1366. }
  1367. // If we are at a lower level, no not do anything unless we are at the highmerc stage
  1368. if ( pSoldier->bLevel == 0 )
  1369. {
  1370. pNode = pNode->pNext;
  1371. continue;
  1372. }
  1373. }
  1374. if ( uiRowFlags == TILES_DYNAMIC_STRUCT_MERCS )
  1375. {
  1376. // If we are not multi-tiled, ignore here
  1377. if ( !( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z ) )
  1378. {
  1379. // If we are at a low level, no not do anything unless we are at the merc stage
  1380. if ( pSoldier->bLevel == 0 )
  1381. {
  1382. pNode = pNode->pNext;
  1383. continue;
  1384. }
  1385. }
  1386. if ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE_Z )
  1387. {
  1388. fSaveZ = TRUE;
  1389. fMultiTransShadowZBlitter = TRUE;
  1390. fZBlitter = TRUE;
  1391. // ATE: Use one direction for queen!
  1392. if ( pSoldier->ubBodyType == QUEENMONSTER )
  1393. {
  1394. sMultiTransShadowZBlitterIndex = 0;
  1395. }
  1396. else
  1397. {
  1398. sMultiTransShadowZBlitterIndex = gOneCDirection[ pSoldier->bDirection ];
  1399. }
  1400. }
  1401. }
  1402. // IF we are not active, or are a placeholder for multi-tile animations do nothing
  1403. //if ( !pSoldier->bActive )
  1404. if ( !pSoldier->bActive || (uiLevelNodeFlags & LEVELNODE_MERCPLACEHOLDER) )
  1405. {
  1406. pNode = pNode->pNext;
  1407. continue;
  1408. }
  1409. // Skip if we cannot see the guy!
  1410. if ( pSoldier->bLastRenderVisibleValue == -1 && !(gTacticalStatus.uiFlags&SHOW_ALL_MERCS) )
  1411. {
  1412. pNode = pNode->pNext;
  1413. continue;
  1414. }
  1415. // Get animation surface....
  1416. usAnimSurface = GetSoldierAnimationSurface( pSoldier, pSoldier->usAnimState );
  1417. if ( usAnimSurface == INVALID_ANIMATION_SURFACE )
  1418. {
  1419. pNode = pNode->pNext;
  1420. continue;
  1421. }
  1422. // Shade guy always lighter than sceane default!
  1423. {
  1424. UINT8 ubShadeLevel;
  1425. ubShadeLevel = (pNode->ubShadeLevel&0x0f);
  1426. ubShadeLevel=__max(ubShadeLevel-2, DEFAULT_SHADE_LEVEL);
  1427. ubShadeLevel|=(pNode->ubShadeLevel&0x30);
  1428. if ( pSoldier->fBeginFade )
  1429. {
  1430. pShadeTable = pSoldier->pCurrentShade = pSoldier->pShades[ pSoldier->ubFadeLevel ];
  1431. }
  1432. else
  1433. {
  1434. pShadeTable = pSoldier->pCurrentShade = pSoldier->pShades[ ubShadeLevel];
  1435. }
  1436. }
  1437. // Position guy based on guy's position
  1438. dOffsetX = pSoldier->dXPos - gsRenderCenterX;
  1439. dOffsetY = pSoldier->dYPos - gsRenderCenterY;
  1440. // Calculate guy's position
  1441. FloatFromCellToScreenCoordinates( dOffsetX, dOffsetY, &dTempX_S, &dTempY_S );
  1442. sXPos = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) + (INT16)dTempX_S;
  1443. sYPos = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) + (INT16)dTempY_S - sTileHeight;
  1444. // Adjust for offset position on screen
  1445. sXPos -= gsRenderWorldOffsetX;
  1446. sYPos -= gsRenderWorldOffsetY;
  1447. // Adjust for soldier height
  1448. sYPos -= pSoldier->sHeightAdjustment;
  1449. // Handle shade stuff....
  1450. if ( !pSoldier->fBeginFade )
  1451. {
  1452. // Special effect - draw ghost if is seen by a guy in player's team but not current guy
  1453. // ATE: Todo: setup flag for 'bad-guy' - can releive some checks in renderer
  1454. if ( !pSoldier->bNeutral && (pSoldier->bSide != gbPlayerNum ) )
  1455. {
  1456. if ( gusSelectedSoldier != NOBODY )
  1457. {
  1458. pSelSoldier = MercPtrs[ gusSelectedSoldier ];
  1459. }
  1460. else
  1461. {
  1462. pSelSoldier = NULL;
  1463. }
  1464. bGlowShadeOffset = 0;
  1465. if ( gTacticalStatus.ubCurrentTeam == gbPlayerNum )
  1466. {
  1467. // Shade differently depending on visiblity
  1468. if ( pSoldier->bLastRenderVisibleValue == 0 )
  1469. {
  1470. bGlowShadeOffset = 10;
  1471. }
  1472. if ( pSelSoldier != NULL )
  1473. {
  1474. if ( pSelSoldier->bOppList[ pSoldier->ubID ] != SEEN_CURRENTLY )
  1475. {
  1476. if ( pSoldier->usAnimState != CHARIOTS_OF_FIRE && pSoldier->usAnimState != BODYEXPLODING )
  1477. {
  1478. bGlowShadeOffset = 10;
  1479. }
  1480. }
  1481. }
  1482. }
  1483. if ( pSoldier->bLevel == 0 )
  1484. {
  1485. pShadeStart = &( pSoldier->pGlowShades[ 0 ] );
  1486. }
  1487. else
  1488. {
  1489. pShadeStart = &( pSoldier->pShades[ 20 ] );
  1490. }
  1491. // Set shade
  1492. // If a bad guy is highlighted
  1493. if ( gfUIHandleSelectionAboveGuy == TRUE && MercPtrs[ gsSelectedGuy ]->bSide != gbPlayerNum )
  1494. {
  1495. if ( gsSelectedGuy == pSoldier->ubID )
  1496. {
  1497. pShadeTable = pShadeStart[ gsGlowFrames[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
  1498. gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
  1499. }
  1500. else
  1501. {
  1502. // Are we dealing with a not-so visible merc?
  1503. if ( bGlowShadeOffset == 10 )
  1504. {
  1505. pShadeTable = pSoldier->pEffectShades[ 0 ];
  1506. }
  1507. }
  1508. }
  1509. else
  1510. {
  1511. // OK,not highlighted, but maybe we are in enemy's turn and they have the baton
  1512. // AI's turn?
  1513. if ( gTacticalStatus.ubCurrentTeam != OUR_TEAM )
  1514. {
  1515. // Does he have baton?
  1516. if ( (pSoldier->uiStatusFlags & SOLDIER_UNDERAICONTROL) )
  1517. {
  1518. pShadeTable = pShadeStart[ gpGlowFramePointer[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
  1519. if ( gpGlowFramePointer[ gsCurrentGlowFrame ] >= 7 )
  1520. {
  1521. gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
  1522. }
  1523. }
  1524. }
  1525. else
  1526. {
  1527. pShadeTable = pShadeStart[ gpGlowFramePointer[ gsCurrentGlowFrame ] + bGlowShadeOffset ];
  1528. if ( gpGlowFramePointer[ gsCurrentGlowFrame ] >= 7 )
  1529. {
  1530. gsForceSoldierZLevel = TOPMOST_Z_LEVEL;
  1531. }
  1532. }
  1533. }
  1534. //if ( gusSelectedSoldier != NOBODY )
  1535. //{
  1536. // pSelSoldier = MercPtrs[ gusSelectedSoldier ];
  1537. // Shade differently depending on visiblity
  1538. // if ( pSoldier->bVisible == 0 || ( pSelSoldier->bOppList[ pSoldier->ubID ] == 0 ) )
  1539. // {
  1540. // Shade gray
  1541. // pShadeTable = pSoldier->pGlowShades[ gpGlowFramePointer[ gsCurrentGlowFrame ] + 10 ];
  1542. // }
  1543. //}
  1544. }
  1545. }
  1546. // Calculate Z level
  1547. SoldierZLevel( pSoldier, iTempPosX_M, iTempPosY_M );
  1548. if(!(uiFlags&TILES_DIRTY))
  1549. {
  1550. if ( pSoldier->fForceShade )
  1551. {
  1552. pShadeTable = pSoldier->pForcedShade;
  1553. }
  1554. }
  1555. // check if we are a merc duplicate, if so, only do minimal stuff!
  1556. if ( pSoldier->ubID >= MAX_NUM_SOLDIERS )
  1557. {
  1558. // Shade gray
  1559. pShadeTable = pSoldier->pEffectShades[ 1 ];
  1560. }
  1561. hVObject=gAnimSurfaceDatabase[ usAnimSurface ].hVideoObject;
  1562. if ( hVObject == NULL )
  1563. {
  1564. pNode = pNode->pNext;
  1565. continue;
  1566. }
  1567. // ATE: If we are in a gridno that we should not use obscure blitter, set!
  1568. if ( !( gpWorldLevelData[ uiTileIndex ].ubExtFlags[0] & MAPELEMENT_EXT_NOBURN_STRUCT ) )
  1569. {
  1570. fObscuredBlitter = TRUE;
  1571. }
  1572. else
  1573. {
  1574. // ATE: Artificially increase z=level...
  1575. sZLevel += 2;
  1576. }
  1577. usImageIndex=pSoldier->usAniFrame;
  1578. uiDirtyFlags=BGND_FLAG_SINGLE|BGND_FLAG_ANIMATED| BGND_FLAG_MERC;
  1579. break;
  1580. }
  1581. // Adjust for interface level
  1582. sYPos += gsRenderHeight;
  1583. // OK, check for LEVELNODE HIDDEN...
  1584. fHiddenTile = FALSE;
  1585. if ( uiLevelNodeFlags & LEVELNODE_HIDDEN )
  1586. {
  1587. fHiddenTile = TRUE;
  1588. if ( TileElem != NULL )
  1589. {
  1590. // If we are a roof and have SHOW_ALL_ROOFS on, turn off hidden tile check!
  1591. if ( ( TileElem->uiFlags & ROOF_TILE ) && ( gTacticalStatus.uiFlags&SHOW_ALL_ROOFS ) )
  1592. {
  1593. // Turn off
  1594. fHiddenTile = FALSE;
  1595. }
  1596. }
  1597. }
  1598. if( fRenderTile && !fHiddenTile )
  1599. {
  1600. fTileInvisible = FALSE;
  1601. if ( ( uiLevelNodeFlags & LEVELNODE_ROTTINGCORPSE ) )
  1602. {
  1603. // Set fmerc flag!
  1604. fMerc = TRUE;
  1605. fZWrite = TRUE;
  1606. //if ( hVObject->ppZStripInfo != NULL )
  1607. {
  1608. sMultiTransShadowZBlitterIndex = GetCorpseStructIndex( &( pCorpse->def ), TRUE );
  1609. fMultiTransShadowZBlitter = TRUE;
  1610. }
  1611. }
  1612. if ( (uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC ) && !(uiFlags&TILES_DIRTY) )
  1613. {
  1614. // Remove flags!
  1615. pNode->uiFlags &= (~LEVELNODE_LASTDYNAMIC );
  1616. fZWrite = TRUE;
  1617. }
  1618. if ( uiLevelNodeFlags & LEVELNODE_NOWRITEZ )
  1619. {
  1620. fZWrite = FALSE;
  1621. }
  1622. if(uiFlags&TILES_NOZWRITE)
  1623. fZWrite=FALSE;
  1624. if ( uiFlags & TILES_NOZ )
  1625. {
  1626. fZBlitter = FALSE;
  1627. }
  1628. if ( ( uiLevelNodeFlags & LEVELNODE_WIREFRAME ) )
  1629. {
  1630. if ( !gGameSettings.fOptions[ TOPTION_TOGGLE_WIREFRAME ] )
  1631. {
  1632. fTileInvisible = TRUE;
  1633. }
  1634. }
  1635. // RENDER
  1636. if ( fTileInvisible )
  1637. {
  1638. }
  1639. else if ( uiLevelNodeFlags & LEVELNODE_DISPLAY_AP && !( uiFlags&TILES_DIRTY ) )
  1640. {
  1641. pTrav = &(hVObject->pETRLEObject[usImageIndex]);
  1642. sXPos += pTrav->sOffsetX;
  1643. sYPos += pTrav->sOffsetY;
  1644. if ( gfUIDisplayActionPointsInvalid )
  1645. {
  1646. SetFontBackground( FONT_MCOLOR_BLACK );
  1647. SetFontForeground( FONT_MCOLOR_WHITE );
  1648. }
  1649. else
  1650. {
  1651. SetFontBackground( FONT_MCOLOR_BLACK );
  1652. SetFontForeground( FONT_MCOLOR_WHITE );
  1653. }
  1654. if ( gfUIDisplayActionPointsBlack )
  1655. {
  1656. SetFontBackground( FONT_MCOLOR_BLACK );
  1657. SetFontForeground( FONT_MCOLOR_BLACK );
  1658. }
  1659. SetFont( TINYFONT1 );
  1660. SetFontDestBuffer( guiSAVEBUFFER , 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, FALSE );
  1661. VarFindFontCenterCoordinates( sXPos, sYPos, 1, 1, TINYFONT1, &sX, &sY, L"%d", pNode->uiAPCost );
  1662. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", pNode->uiAPCost );
  1663. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  1664. }
  1665. else if ( ( uiLevelNodeFlags & LEVELNODE_ERASEZ ) && !( uiFlags&TILES_DIRTY ) )
  1666. {
  1667. Zero8BPPDataTo16BPPBufferTransparent( (UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex );
  1668. //Zero8BPPDataTo16BPPBufferTransparent( (UINT16*)gpZBuffer, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex );
  1669. }
  1670. else if ( ( uiLevelNodeFlags & LEVELNODE_ITEM ) && !( uiFlags&TILES_DIRTY ) )
  1671. {
  1672. BOOLEAN fZBlit = FALSE;
  1673. if ( uiRowFlags == TILES_STATIC_ONROOF || uiRowFlags == TILES_DYNAMIC_ONROOF )
  1674. {
  1675. usOutlineColor = gusYellowItemOutlineColor;
  1676. bItemOutline = TRUE;
  1677. fZBlit = TRUE;
  1678. }
  1679. else
  1680. {
  1681. usOutlineColor = gusNormalItemOutlineColor;
  1682. bItemOutline = TRUE;
  1683. fZBlit = TRUE;
  1684. }
  1685. if ( gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] )
  1686. {
  1687. if ( uiRowFlags == TILES_STATIC_ONROOF || uiRowFlags == TILES_DYNAMIC_ONROOF )
  1688. {
  1689. usOutlineColor = us16BPPItemCycleYellowColors[ gsCurrentItemGlowFrame ];
  1690. bItemOutline = TRUE;
  1691. }
  1692. else
  1693. {
  1694. if ( gTacticalStatus.uiFlags & RED_ITEM_GLOW_ON )
  1695. {
  1696. usOutlineColor = us16BPPItemCycleRedColors[ gsCurrentItemGlowFrame ];
  1697. bItemOutline = TRUE;
  1698. }
  1699. else
  1700. {
  1701. usOutlineColor = us16BPPItemCycleWhiteColors[ gsCurrentItemGlowFrame ];
  1702. bItemOutline = TRUE;
  1703. }
  1704. }
  1705. }
  1706. //else
  1707. //{
  1708. // usOutlineColor = us16BPPItemCycleWhiteColors[ pItemPool->bFlashColor ];
  1709. // bItemOutline = TRUE;
  1710. //}
  1711. bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1712. if ( bBlitClipVal == FALSE )
  1713. {
  1714. if ( fZBlit )
  1715. {
  1716. if ( fObscuredBlitter )
  1717. {
  1718. Blt8BPPDataTo16BPPBufferOutlineZPixelateObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
  1719. }
  1720. else
  1721. {
  1722. Blt8BPPDataTo16BPPBufferOutlineZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
  1723. }
  1724. }
  1725. else
  1726. {
  1727. Blt8BPPDataTo16BPPBufferOutline((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
  1728. }
  1729. }
  1730. else if ( bBlitClipVal == TRUE )
  1731. {
  1732. if ( fZBlit )
  1733. {
  1734. if ( fObscuredBlitter )
  1735. {
  1736. Blt8BPPDataTo16BPPBufferOutlineZPixelateObscuredClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
  1737. }
  1738. else
  1739. {
  1740. Blt8BPPDataTo16BPPBufferOutlineZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
  1741. }
  1742. }
  1743. else
  1744. {
  1745. Blt8BPPDataTo16BPPBufferOutlineClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
  1746. }
  1747. }
  1748. }
  1749. // ATE: Check here for a lot of conditions!
  1750. else if ( ( ( uiLevelNodeFlags & LEVELNODE_PHYSICSOBJECT ) ) && !( uiFlags&TILES_DIRTY ) )
  1751. {
  1752. bItemOutline = TRUE;
  1753. if ( uiLevelNodeFlags & LEVELNODE_PHYSICSOBJECT )
  1754. {
  1755. bItemOutline = FALSE;
  1756. }
  1757. bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1758. if ( fShadowBlitter )
  1759. {
  1760. if ( bBlitClipVal == FALSE )
  1761. {
  1762. Blt8BPPDataTo16BPPBufferShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex );
  1763. }
  1764. else
  1765. {
  1766. Blt8BPPDataTo16BPPBufferShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
  1767. }
  1768. }
  1769. else
  1770. {
  1771. if ( bBlitClipVal == FALSE )
  1772. {
  1773. Blt8BPPDataTo16BPPBufferOutlineZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline );
  1774. }
  1775. else if ( bBlitClipVal == TRUE )
  1776. {
  1777. Blt8BPPDataTo16BPPBufferOutlineClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, usOutlineColor, bItemOutline, &gClippingRect );
  1778. }
  1779. }
  1780. }
  1781. else if(uiFlags&TILES_DIRTY)
  1782. {
  1783. if ( !(uiLevelNodeFlags & LEVELNODE_LASTDYNAMIC ) )
  1784. {
  1785. pTrav = &(hVObject->pETRLEObject[usImageIndex]);
  1786. uiBrushHeight = (UINT32)pTrav->usHeight;
  1787. uiBrushWidth = (UINT32)pTrav->usWidth;
  1788. sXPos += pTrav->sOffsetX;
  1789. sYPos += pTrav->sOffsetY;
  1790. RegisterBackgroundRect(uiDirtyFlags, NULL, sXPos, sYPos, (INT16)(sXPos + uiBrushWidth), (INT16)(__min((INT16)(sYPos + uiBrushHeight), gsVIEWPORT_WINDOW_END_Y)));
  1791. if ( fSaveZ )
  1792. {
  1793. RegisterBackgroundRect(uiDirtyFlags | BGND_FLAG_SAVE_Z, NULL, sXPos, sYPos, (INT16)(sXPos + uiBrushWidth), (INT16)(__min((INT16)(sYPos + uiBrushHeight), gsVIEWPORT_WINDOW_END_Y)));
  1794. }
  1795. }
  1796. }
  1797. else
  1798. {
  1799. if(gbPixelDepth==16)
  1800. {
  1801. /*if(fConvertTo16)
  1802. {
  1803. ConvertVObjectRegionTo16BPP(hVObject, usImageIndex, 4);
  1804. if(CheckFor16BPPRegion(hVObject, usImageIndex, 4, &us16BPPIndex))
  1805. {
  1806. Blt16BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, us16BPPIndex, &gClippingRect);
  1807. }
  1808. }*/
  1809. if( fMultiTransShadowZBlitter )
  1810. {
  1811. if ( fZBlitter )
  1812. {
  1813. if ( fObscuredBlitter )
  1814. {
  1815. Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect, sMultiTransShadowZBlitterIndex, pShadeTable );
  1816. }
  1817. else
  1818. {
  1819. Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect, sMultiTransShadowZBlitterIndex, pShadeTable );
  1820. }
  1821. }
  1822. else
  1823. {
  1824. //Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
  1825. }
  1826. }
  1827. else if( fMultiZBlitter )
  1828. {
  1829. if ( fZBlitter )
  1830. {
  1831. if ( fObscuredBlitter )
  1832. {
  1833. Blt8BPPDataTo16BPPBufferTransZIncObscureClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1834. }
  1835. else
  1836. {
  1837. if ( fWallTile )
  1838. {
  1839. Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1840. }
  1841. else
  1842. {
  1843. Blt8BPPDataTo16BPPBufferTransZIncClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1844. }
  1845. }
  1846. }
  1847. else
  1848. {
  1849. Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect );
  1850. }
  1851. }
  1852. else
  1853. {
  1854. bBlitClipVal = BltIsClippedOrOffScreen(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1855. if ( bBlitClipVal == TRUE )
  1856. {
  1857. if(fPixelate)
  1858. {
  1859. if(fTranslucencyType)
  1860. {
  1861. //if(fZWrite)
  1862. // Blt8BPPDataTo16BPPBufferTransZClipTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1863. //else
  1864. Blt8BPPDataTo16BPPBufferTransZNBClipTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1865. }
  1866. else
  1867. {
  1868. //if(fZWrite)
  1869. // Blt8BPPDataTo16BPPBufferTransZClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1870. //else
  1871. Blt8BPPDataTo16BPPBufferTransZNBClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1872. }
  1873. }
  1874. else if(fMerc)
  1875. {
  1876. if ( fZBlitter )
  1877. {
  1878. if ( fZWrite )
  1879. {
  1880. Blt8BPPDataTo16BPPBufferTransShadowZClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  1881. hVObject,
  1882. sXPos, sYPos,
  1883. usImageIndex,
  1884. &gClippingRect,
  1885. pShadeTable);
  1886. }
  1887. else
  1888. {
  1889. if ( fObscuredBlitter )
  1890. {
  1891. Blt8BPPDataTo16BPPBufferTransShadowZNBObscuredClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  1892. hVObject,
  1893. sXPos, sYPos,
  1894. usImageIndex,
  1895. &gClippingRect,
  1896. pShadeTable);
  1897. }
  1898. else
  1899. {
  1900. Blt8BPPDataTo16BPPBufferTransShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  1901. hVObject,
  1902. sXPos, sYPos,
  1903. usImageIndex,
  1904. &gClippingRect,
  1905. pShadeTable);
  1906. }
  1907. }
  1908. if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
  1909. {
  1910. pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
  1911. // BLIT HERE
  1912. Blt8BPPDataTo16BPPBufferTransShadowClip( (UINT16*)pSaveBuf, uiSaveBufferPitchBYTES,
  1913. hVObject,
  1914. sXPos, sYPos,
  1915. usImageIndex,
  1916. &gClippingRect,
  1917. pShadeTable);
  1918. UnLockVideoSurface(guiSAVEBUFFER);
  1919. // Turn it off!
  1920. pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
  1921. }
  1922. }
  1923. else
  1924. {
  1925. Blt8BPPDataTo16BPPBufferTransShadowClip( (UINT16*)pDestBuf, uiDestPitchBYTES,
  1926. hVObject,
  1927. sXPos, sYPos,
  1928. usImageIndex,
  1929. &gClippingRect,
  1930. pShadeTable);
  1931. }
  1932. }
  1933. else if(fShadowBlitter)
  1934. {
  1935. if ( fZBlitter )
  1936. {
  1937. if(fZWrite)
  1938. Blt8BPPDataTo16BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1939. else
  1940. Blt8BPPDataTo16BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1941. }
  1942. else
  1943. {
  1944. Blt8BPPDataTo16BPPBufferShadowClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1945. }
  1946. }
  1947. else if( fIntensityBlitter)
  1948. {
  1949. if ( fZBlitter )
  1950. {
  1951. if(fZWrite)
  1952. Blt8BPPDataTo16BPPBufferIntensityZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1953. else
  1954. Blt8BPPDataTo16BPPBufferIntensityZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1955. }
  1956. else
  1957. {
  1958. Blt8BPPDataTo16BPPBufferIntensityClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1959. }
  1960. }
  1961. else if(fZBlitter)
  1962. {
  1963. if(fZWrite)
  1964. {
  1965. if ( fObscuredBlitter )
  1966. {
  1967. Blt8BPPDataTo16BPPBufferTransZClipPixelateObscured((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1968. }
  1969. else
  1970. {
  1971. Blt8BPPDataTo16BPPBufferTransZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1972. }
  1973. }
  1974. else
  1975. {
  1976. Blt8BPPDataTo16BPPBufferTransZNBClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1977. }
  1978. if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
  1979. {
  1980. pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
  1981. // BLIT HERE
  1982. Blt8BPPDataTo16BPPBufferTransZClip((UINT16*)pSaveBuf, uiSaveBufferPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1983. UnLockVideoSurface(guiSAVEBUFFER);
  1984. // Turn it off!
  1985. pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
  1986. }
  1987. }
  1988. else
  1989. Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  1990. }
  1991. else if ( bBlitClipVal == FALSE )
  1992. {
  1993. if(fPixelate)
  1994. {
  1995. if(fTranslucencyType)
  1996. {
  1997. if(fZWrite)
  1998. Blt8BPPDataTo16BPPBufferTransZTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  1999. else
  2000. Blt8BPPDataTo16BPPBufferTransZNBTranslucent((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2001. }
  2002. else
  2003. {
  2004. if(fZWrite)
  2005. Blt8BPPDataTo16BPPBufferTransZPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2006. else
  2007. Blt8BPPDataTo16BPPBufferTransZNBPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2008. }
  2009. }
  2010. else if(fMerc)
  2011. {
  2012. if ( fZBlitter )
  2013. {
  2014. if ( fZWrite )
  2015. {
  2016. Blt8BPPDataTo16BPPBufferTransShadowZ( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2017. hVObject,
  2018. sXPos, sYPos,
  2019. usImageIndex,
  2020. pShadeTable);
  2021. }
  2022. else
  2023. {
  2024. if ( fObscuredBlitter )
  2025. {
  2026. Blt8BPPDataTo16BPPBufferTransShadowZNBObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2027. hVObject,
  2028. sXPos, sYPos,
  2029. usImageIndex,
  2030. pShadeTable);
  2031. }
  2032. else
  2033. {
  2034. Blt8BPPDataTo16BPPBufferTransShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2035. hVObject,
  2036. sXPos, sYPos,
  2037. usImageIndex,
  2038. pShadeTable);
  2039. }
  2040. }
  2041. if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
  2042. {
  2043. pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
  2044. // BLIT HERE
  2045. Blt8BPPDataTo16BPPBufferTransShadow( (UINT16*)pSaveBuf, uiSaveBufferPitchBYTES,
  2046. hVObject,
  2047. sXPos, sYPos,
  2048. usImageIndex,
  2049. pShadeTable);
  2050. UnLockVideoSurface(guiSAVEBUFFER);
  2051. // Turn it off!
  2052. pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
  2053. }
  2054. }
  2055. else
  2056. {
  2057. Blt8BPPDataTo16BPPBufferTransShadow( (UINT16*)pDestBuf, uiDestPitchBYTES,
  2058. hVObject,
  2059. sXPos, sYPos,
  2060. usImageIndex,
  2061. pShadeTable);
  2062. }
  2063. }
  2064. else if(fShadowBlitter)
  2065. {
  2066. if ( fZBlitter )
  2067. {
  2068. if(fZWrite)
  2069. Blt8BPPDataTo16BPPBufferShadowZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2070. else
  2071. Blt8BPPDataTo16BPPBufferShadowZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2072. }
  2073. else
  2074. {
  2075. Blt8BPPDataTo16BPPBufferShadow((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
  2076. }
  2077. }
  2078. else if( fIntensityBlitter )
  2079. {
  2080. if ( fZBlitter )
  2081. {
  2082. if(fZWrite)
  2083. Blt8BPPDataTo16BPPBufferIntensityZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2084. else
  2085. Blt8BPPDataTo16BPPBufferIntensityZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2086. }
  2087. else
  2088. {
  2089. Blt8BPPDataTo16BPPBufferIntensity((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
  2090. }
  2091. }
  2092. else if(fZBlitter)
  2093. {
  2094. if(fZWrite)
  2095. {
  2096. // TEST
  2097. //Blt8BPPDataTo16BPPBufferTransZPixelate( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2098. if ( fObscuredBlitter )
  2099. {
  2100. Blt8BPPDataTo16BPPBufferTransZPixelateObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2101. }
  2102. else
  2103. {
  2104. Blt8BPPDataTo16BPPBufferTransZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2105. }
  2106. }
  2107. else
  2108. Blt8BPPDataTo16BPPBufferTransZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2109. if ( (uiLevelNodeFlags & LEVELNODE_UPDATESAVEBUFFERONCE ) )
  2110. {
  2111. pSaveBuf = LockVideoSurface(guiSAVEBUFFER, &uiSaveBufferPitchBYTES );
  2112. // BLIT HERE
  2113. Blt8BPPDataTo16BPPBufferTransZ((UINT16*)pSaveBuf, uiSaveBufferPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex );
  2114. UnLockVideoSurface(guiSAVEBUFFER);
  2115. // Turn it off!
  2116. pNode->uiFlags &= ( ~LEVELNODE_UPDATESAVEBUFFERONCE );
  2117. }
  2118. }
  2119. else
  2120. Blt8BPPDataTo16BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
  2121. }
  2122. }
  2123. }
  2124. else // 8bpp section
  2125. {
  2126. if(fPixelate)
  2127. {
  2128. if(fZWrite)
  2129. Blt8BPPDataTo8BPPBufferTransZClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2130. else
  2131. Blt8BPPDataTo8BPPBufferTransZNBClipPixelate((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2132. }
  2133. else if(BltIsClipped(hVObject, sXPos, sYPos, usImageIndex, &gClippingRect))
  2134. {
  2135. if(fMerc)
  2136. {
  2137. Blt8BPPDataTo8BPPBufferTransShadowZNBClip( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2138. hVObject,
  2139. sXPos, sYPos,
  2140. usImageIndex,
  2141. &gClippingRect,
  2142. pShadeTable);
  2143. }
  2144. else if(fShadowBlitter)
  2145. if(fZWrite)
  2146. Blt8BPPDataTo8BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2147. else
  2148. Blt8BPPDataTo8BPPBufferShadowZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2149. else if(fZBlitter)
  2150. {
  2151. if(fZWrite)
  2152. Blt8BPPDataTo8BPPBufferTransZClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2153. else
  2154. Blt8BPPDataTo8BPPBufferTransZNBClip((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2155. }
  2156. else
  2157. Blt8BPPDataTo8BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex, &gClippingRect);
  2158. }
  2159. else
  2160. {
  2161. if(fMerc)
  2162. {
  2163. Blt8BPPDataTo16BPPBufferTransShadowZNBObscured( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2164. hVObject,
  2165. sXPos, sYPos,
  2166. usImageIndex,
  2167. pShadeTable);
  2168. // Blt8BPPDataTo8BPPBufferTransShadowZNB( (UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel,
  2169. // hVObject,
  2170. // sXPos, sYPos,
  2171. // usImageIndex,
  2172. // pShadeTable);
  2173. }
  2174. else if(fShadowBlitter)
  2175. {
  2176. if(fZWrite)
  2177. Blt8BPPDataTo8BPPBufferShadowZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2178. else
  2179. Blt8BPPDataTo8BPPBufferShadowZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2180. }
  2181. else if(fZBlitter)
  2182. {
  2183. if(fZWrite)
  2184. Blt8BPPDataTo8BPPBufferTransZ((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2185. else
  2186. Blt8BPPDataTo8BPPBufferTransZNB((UINT16*)pDestBuf, uiDestPitchBYTES, gpZBuffer, sZLevel, hVObject, sXPos, sYPos, usImageIndex);
  2187. }
  2188. else
  2189. Blt8BPPDataTo8BPPBufferTransparent((UINT16*)pDestBuf, uiDestPitchBYTES, hVObject, sXPos, sYPos, usImageIndex);
  2190. }
  2191. }
  2192. }
  2193. // RENDR APS ONTOP OF PLANNED MERC GUY
  2194. if ( fRenderTile && !( uiFlags&TILES_DIRTY ) )
  2195. {
  2196. if ( fMerc )
  2197. {
  2198. if ( pSoldier != NULL && pSoldier->ubID >= MAX_NUM_SOLDIERS )
  2199. {
  2200. SetFont( TINYFONT1 );
  2201. SetFontDestBuffer( guiSAVEBUFFER , 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, FALSE );
  2202. VarFindFontCenterCoordinates( sXPos, sYPos, 1, 1, TINYFONT1, &sX, &sY, L"%d", pSoldier->ubPlannedUIAPCost );
  2203. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", pSoldier->ubPlannedUIAPCost );
  2204. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  2205. }
  2206. }
  2207. }
  2208. }
  2209. if(!fLinkedListDirection)
  2210. pNode = pNode->pPrevNode;
  2211. else
  2212. pNode = pNode->pNext;
  2213. //pNode = NULL;
  2214. }
  2215. }
  2216. else
  2217. {
  2218. if( gfEditMode )
  2219. {
  2220. //ATE: Used here in the editor to denote then an area is not in the world
  2221. //Kris: Fixed a couple things here...
  2222. // First, there was a problem with the FRAME_BUFFER already being locked which caused failures,
  2223. // and eventual crashes, so if it reaches this code, the buffer needs to be unlocked first, as
  2224. // it gets locked and unlocked internally within ColorFillVideoSurfaceArea(). I'm surprised
  2225. // this problem didn't surface a long time ago. Anyway, it seems that scrolling to the bottom
  2226. // right hand corner of the map, would cause the end of the world to be drawn. Now, this would
  2227. // only crash on my computer and not Emmons, so this should work. Also, I changed the color
  2228. // from fluorescent green to black, which is easier on the eyes, and prevent the drawing of the
  2229. // end of the world if it would be drawn on the editor's taskbar.
  2230. if( iTempPosY_S < 360 )
  2231. {
  2232. if(!(uiFlags&TILES_DIRTY))
  2233. UnLockVideoSurface( FRAME_BUFFER );
  2234. ColorFillVideoSurfaceArea( FRAME_BUFFER, iTempPosX_S, iTempPosY_S, (INT16)(iTempPosX_S + 40),
  2235. (INT16)( min( iTempPosY_S + 20, 360 )), Get16BPPColor( FROMRGB( 0, 0, 0 ) ) );
  2236. if(!(uiFlags&TILES_DIRTY))
  2237. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  2238. }
  2239. }
  2240. }
  2241. iTempPosX_S += 40;
  2242. iTempPosX_M ++;
  2243. iTempPosY_M --;
  2244. if ( iTempPosX_S >= iEndXS )
  2245. {
  2246. fEndRenderRow = TRUE;
  2247. }
  2248. } while( !fEndRenderRow );
  2249. }
  2250. }
  2251. // } while( FALSE );
  2252. if ( bXOddFlag > 0 )
  2253. {
  2254. iAnchorPosY_M ++;
  2255. }
  2256. else
  2257. {
  2258. iAnchorPosX_M ++;
  2259. }
  2260. bXOddFlag = !bXOddFlag;
  2261. iAnchorPosY_S += 10;
  2262. if ( iAnchorPosY_S >= iEndYS )
  2263. {
  2264. fEndRenderCol = TRUE;
  2265. }
  2266. }
  2267. while( !fEndRenderCol );
  2268. if(!(uiFlags&TILES_DIRTY))
  2269. UnLockVideoSurface( FRAME_BUFFER );
  2270. if ( uiFlags & TILES_DYNAMIC_CHECKFOR_INT_TILE )
  2271. {
  2272. EndCurInteractiveTileCheck( );
  2273. }
  2274. }
  2275. void DeleteFromWorld( UINT16 usTileIndex, UINT32 uiRenderTiles, UINT16 usIndex )
  2276. {
  2277. switch( uiRenderTiles )
  2278. {
  2279. case TILES_DYNAMIC_LAND:
  2280. case TILES_STATIC_LAND:
  2281. RemoveLand( usTileIndex, usIndex );
  2282. break;
  2283. case TILES_DYNAMIC_OBJECTS:
  2284. case TILES_STATIC_OBJECTS:
  2285. RemoveObject( usTileIndex, usIndex );
  2286. break;
  2287. case TILES_STATIC_STRUCTURES:
  2288. case TILES_DYNAMIC_STRUCTURES:
  2289. RemoveStruct( usTileIndex, usIndex );
  2290. break;
  2291. case TILES_DYNAMIC_ROOF:
  2292. case TILES_STATIC_ROOF:
  2293. RemoveRoof( usTileIndex, usIndex );
  2294. break;
  2295. case TILES_STATIC_ONROOF:
  2296. RemoveOnRoof( usTileIndex, usIndex );
  2297. break;
  2298. case TILES_DYNAMIC_TOPMOST:
  2299. case TILES_STATIC_TOPMOST:
  2300. RemoveTopmost( usTileIndex, usIndex );
  2301. break;
  2302. }
  2303. }
  2304. // memcpy's the background to the new scroll position, and renders the missing strip
  2305. // via the RenderStaticWorldRect. Dynamic stuff will be updated on the next frame
  2306. // by the normal render cycle
  2307. void ScrollBackground(UINT32 uiDirection, INT16 sScrollXIncrement, INT16 sScrollYIncrement )
  2308. {
  2309. //RestoreBackgroundRects();
  2310. if ( !gfDoVideoScroll )
  2311. {
  2312. // Clear z-buffer
  2313. memset(gpZBuffer, LAND_Z_LEVEL, 1280* gsVIEWPORT_END_Y );
  2314. RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y, FALSE );
  2315. FreeBackgroundRectType(BGND_FLAG_ANIMATED);
  2316. }
  2317. else
  2318. {
  2319. if ( gfRenderScroll == FALSE )
  2320. {
  2321. guiScrollDirection = uiDirection;
  2322. gfScrollStart = TRUE;
  2323. gsScrollXIncrement = 0;
  2324. gsScrollYIncrement = 0;
  2325. }
  2326. else
  2327. {
  2328. guiScrollDirection |= uiDirection;
  2329. gfScrollStart = FALSE;
  2330. }
  2331. gfRenderScroll = TRUE;
  2332. gsScrollXIncrement += sScrollXIncrement;
  2333. gsScrollYIncrement += sScrollYIncrement;
  2334. }
  2335. }
  2336. // Render routine takes center X, Y and Z coordinate and gets world
  2337. // Coordinates for the window from that using the following functions
  2338. // For coordinate transformations
  2339. void RenderWorld( )
  2340. {
  2341. TILE_ELEMENT *TileElem;
  2342. TILE_ANIMATION_DATA *pAnimData;
  2343. UINT32 cnt = 0;
  2344. gfRenderFullThisFrame = FALSE;
  2345. // If we are testing renderer, set background to pink!
  2346. if ( gTacticalStatus.uiFlags & DEBUGCLIFFS )
  2347. {
  2348. ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, gsVIEWPORT_WINDOW_START_Y, 640, gsVIEWPORT_WINDOW_END_Y, Get16BPPColor( FROMRGB( 0, 255, 0 ) ) );
  2349. SetRenderFlags(RENDER_FLAG_FULL);
  2350. }
  2351. if ( gTacticalStatus.uiFlags & SHOW_Z_BUFFER )
  2352. {
  2353. SetRenderFlags(RENDER_FLAG_FULL);
  2354. }
  2355. // SetRenderFlags(RENDER_FLAG_FULL);
  2356. // FOR NOW< HERE, UPDATE ANIMATED TILES
  2357. if ( COUNTERDONE( ANIMATETILES ) )
  2358. {
  2359. RESETCOUNTER( ANIMATETILES );
  2360. while( cnt < gusNumAnimatedTiles )
  2361. {
  2362. TileElem = &(gTileDatabase[ gusAnimatedTiles[ cnt ] ] );
  2363. pAnimData = TileElem->pAnimData;
  2364. Assert( pAnimData != NULL );
  2365. pAnimData->bCurrentFrame++;
  2366. if ( pAnimData->bCurrentFrame >= pAnimData->ubNumFrames )
  2367. pAnimData->bCurrentFrame = 0;
  2368. cnt++;
  2369. }
  2370. }
  2371. // HERE, UPDATE GLOW INDEX
  2372. if ( COUNTERDONE( GLOW_ENEMYS ) )
  2373. {
  2374. RESETCOUNTER( GLOW_ENEMYS );
  2375. gsCurrentGlowFrame++;
  2376. if ( gsCurrentGlowFrame == NUM_GLOW_FRAMES )
  2377. {
  2378. gsCurrentGlowFrame = 0;
  2379. }
  2380. gsCurrentItemGlowFrame++;
  2381. if ( gsCurrentItemGlowFrame == NUM_ITEM_CYCLE_COLORS )
  2382. {
  2383. gsCurrentItemGlowFrame = 0;
  2384. }
  2385. }
  2386. //RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2387. //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2388. //return;
  2389. //#if 0
  2390. if(gRenderFlags&RENDER_FLAG_FULL)
  2391. {
  2392. gfRenderFullThisFrame = TRUE;
  2393. gfTopMessageDirty = TRUE;
  2394. // Dirty the interface...
  2395. fInterfacePanelDirty = DIRTYLEVEL2;
  2396. // Apply scrolling sets some world variables
  2397. ApplyScrolling( gsRenderCenterX, gsRenderCenterY, TRUE, FALSE );
  2398. ResetLayerOptimizing();
  2399. if ( (gRenderFlags&RENDER_FLAG_NOZ ) )
  2400. {
  2401. RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y, FALSE );
  2402. }
  2403. else
  2404. {
  2405. RenderStaticWorld();
  2406. }
  2407. if(!(gRenderFlags&RENDER_FLAG_SAVEOFF))
  2408. UpdateSaveBuffer();
  2409. }
  2410. else if(gRenderFlags&RENDER_FLAG_MARKED)
  2411. {
  2412. ResetLayerOptimizing();
  2413. RenderMarkedWorld();
  2414. if(!(gRenderFlags&RENDER_FLAG_SAVEOFF))
  2415. UpdateSaveBuffer();
  2416. }
  2417. if ( gfScrollInertia == FALSE || (gRenderFlags&RENDER_FLAG_NOZ ) || (gRenderFlags&RENDER_FLAG_FULL ) || (gRenderFlags&RENDER_FLAG_MARKED ) )
  2418. {
  2419. RenderDynamicWorld( );
  2420. }
  2421. if ( gfScrollInertia )
  2422. {
  2423. EmptyBackgroundRects( );
  2424. }
  2425. if( gRenderFlags&RENDER_FLAG_ROOMIDS )
  2426. {
  2427. RenderRoomInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  2428. }
  2429. #ifdef _DEBUG
  2430. if( gRenderFlags&RENDER_FLAG_FOVDEBUG )
  2431. {
  2432. RenderFOVDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  2433. }
  2434. else if (gfDisplayCoverValues)
  2435. {
  2436. RenderCoverDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  2437. }
  2438. else if (gfDisplayGridNoVisibleValues)
  2439. {
  2440. RenderGridNoVisibleDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  2441. }
  2442. #endif
  2443. //#endif
  2444. //RenderStaticWorldRect( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2445. //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2446. if(gRenderFlags&RENDER_FLAG_MARKED)
  2447. ClearMarkedTiles();
  2448. if ( gRenderFlags&RENDER_FLAG_CHECKZ && !(gTacticalStatus.uiFlags & NOHIDE_REDUNDENCY) )
  2449. {
  2450. ExamineZBufferRect( gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
  2451. }
  2452. gRenderFlags&=(~(RENDER_FLAG_FULL|RENDER_FLAG_MARKED|RENDER_FLAG_ROOMIDS|RENDER_FLAG_CHECKZ));
  2453. if ( gTacticalStatus.uiFlags & SHOW_Z_BUFFER )
  2454. {
  2455. // COPY Z BUFFER TO FRAME BUFFER
  2456. UINT32 uiDestPitchBYTES;
  2457. UINT16 *pDestBuf;
  2458. UINT32 cnt;
  2459. INT16 zVal;
  2460. pDestBuf = (INT16*)LockVideoSurface(guiRENDERBUFFER, &uiDestPitchBYTES);
  2461. for ( cnt = 0; cnt < ( 640 * 480 ); cnt++ )
  2462. {
  2463. // Get Z value
  2464. zVal = gpZBuffer[ cnt ];
  2465. pDestBuf[cnt] = zVal;
  2466. }
  2467. UnLockVideoSurface(guiRENDERBUFFER);
  2468. }
  2469. }
  2470. // Start with a center X,Y,Z world coordinate and render direction
  2471. // Determine WorldIntersectionPoint and the starting block from these
  2472. // Then render away!
  2473. void RenderStaticWorldRect(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom, BOOLEAN fDynamicsToo )
  2474. {
  2475. UINT32 uiLevelFlags[10];
  2476. UINT16 sLevelIDs[10];
  2477. // Calculate render starting parameters
  2478. CalcRenderParameters( sLeft, sTop, sRight, sBottom );
  2479. // Reset layer optimizations
  2480. ResetLayerOptimizing( );
  2481. // STATICS
  2482. uiLevelFlags[0] = TILES_STATIC_LAND;
  2483. //uiLevelFlags[1] = TILES_STATIC_OBJECTS;
  2484. sLevelIDs[0] = RENDER_STATIC_LAND;
  2485. //sLevelIDs[1] = RENDER_STATIC_OBJECTS;
  2486. RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
  2487. //#if 0
  2488. uiLevelFlags[0] = TILES_STATIC_OBJECTS;
  2489. sLevelIDs[0] = RENDER_STATIC_OBJECTS;
  2490. RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
  2491. if(gRenderFlags&RENDER_FLAG_SHADOWS )
  2492. {
  2493. uiLevelFlags[0] = TILES_STATIC_SHADOWS;
  2494. sLevelIDs[0] = RENDER_STATIC_SHADOWS;
  2495. RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags , sLevelIDs );
  2496. }
  2497. uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
  2498. uiLevelFlags[1] = TILES_STATIC_ROOF;
  2499. uiLevelFlags[2] = TILES_STATIC_ONROOF;
  2500. uiLevelFlags[3] = TILES_STATIC_TOPMOST;
  2501. sLevelIDs[0] = RENDER_STATIC_STRUCTS;
  2502. sLevelIDs[1] = RENDER_STATIC_ROOF;
  2503. sLevelIDs[2] = RENDER_STATIC_ONROOF;
  2504. sLevelIDs[3] = RENDER_STATIC_TOPMOST;
  2505. RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 4, uiLevelFlags, sLevelIDs );
  2506. //ATE: Do obsucred layer!
  2507. uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
  2508. sLevelIDs[0] = RENDER_STATIC_STRUCTS;
  2509. uiLevelFlags[1] = TILES_STATIC_ONROOF;
  2510. sLevelIDs[1] = RENDER_STATIC_ONROOF;
  2511. RenderTiles( TILES_OBSCURED, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 2, uiLevelFlags, sLevelIDs );
  2512. //uiLevelFlags[0] = TILES_DYNAMIC_MERCS;
  2513. //uiLevelFlags[1] = TILES_DYNAMIC_HIGHMERCS;
  2514. //sLevelIDs[0] = RENDER_DYNAMIC_MERCS;
  2515. //sLevelIDs[1] = RENDER_DYNAMIC_HIGHMERCS;
  2516. //RenderTiles( 0, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2517. if ( fDynamicsToo )
  2518. {
  2519. // DYNAMICS
  2520. uiLevelFlags[0] = TILES_DYNAMIC_LAND;
  2521. uiLevelFlags[1] = TILES_DYNAMIC_OBJECTS;
  2522. uiLevelFlags[2] = TILES_DYNAMIC_SHADOWS;
  2523. uiLevelFlags[3] = TILES_DYNAMIC_STRUCT_MERCS;
  2524. uiLevelFlags[4] = TILES_DYNAMIC_MERCS;
  2525. uiLevelFlags[5] = TILES_DYNAMIC_STRUCTURES;
  2526. uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
  2527. uiLevelFlags[7] = TILES_DYNAMIC_HIGHMERCS;
  2528. uiLevelFlags[8] = TILES_DYNAMIC_ONROOF;
  2529. sLevelIDs[0] = RENDER_DYNAMIC_LAND;
  2530. sLevelIDs[1] = RENDER_DYNAMIC_OBJECTS;
  2531. sLevelIDs[2] = RENDER_DYNAMIC_SHADOWS;
  2532. sLevelIDs[3] = RENDER_DYNAMIC_STRUCT_MERCS;
  2533. sLevelIDs[4] = RENDER_DYNAMIC_MERCS;
  2534. sLevelIDs[5] = RENDER_DYNAMIC_STRUCTS;
  2535. sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
  2536. sLevelIDs[7] = RENDER_DYNAMIC_HIGHMERCS;
  2537. sLevelIDs[8] = RENDER_DYNAMIC_ONROOF;
  2538. RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 9, uiLevelFlags , sLevelIDs );
  2539. SumAddiviveLayerOptimization( );
  2540. }
  2541. ResetRenderParameters( );
  2542. if ( !gfDoVideoScroll )
  2543. {
  2544. //AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
  2545. AddBaseDirtyRect(sLeft, sTop, sRight, sBottom );
  2546. }
  2547. //#endif
  2548. }
  2549. void RenderStaticWorld( )
  2550. {
  2551. UINT32 uiLevelFlags[9];
  2552. UINT16 sLevelIDs[9];
  2553. // Calculate render starting parameters
  2554. CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2555. // Clear z-buffer
  2556. memset(gpZBuffer, LAND_Z_LEVEL, 1280* gsVIEWPORT_END_Y );
  2557. FreeBackgroundRectType(BGND_FLAG_ANIMATED);
  2558. InvalidateBackgroundRects();
  2559. uiLevelFlags[0] = TILES_STATIC_LAND;
  2560. //uiLevelFlags[1] = TILES_STATIC_OBJECTS;
  2561. sLevelIDs[0] = RENDER_STATIC_LAND;
  2562. //sLevelIDs[1] = RENDER_STATIC_OBJECTS;
  2563. RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
  2564. uiLevelFlags[0] = TILES_STATIC_OBJECTS;
  2565. sLevelIDs[0] = RENDER_STATIC_OBJECTS;
  2566. RenderTiles( 0 , gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags, sLevelIDs );
  2567. if(gRenderFlags&RENDER_FLAG_SHADOWS )
  2568. {
  2569. uiLevelFlags[0] = TILES_STATIC_SHADOWS;
  2570. sLevelIDs[0] = RENDER_STATIC_SHADOWS;
  2571. RenderTiles(0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 1, uiLevelFlags , sLevelIDs );
  2572. }
  2573. uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
  2574. uiLevelFlags[1] = TILES_STATIC_ROOF;
  2575. uiLevelFlags[2] = TILES_STATIC_ONROOF;
  2576. uiLevelFlags[3] = TILES_STATIC_TOPMOST;
  2577. sLevelIDs[0] = RENDER_STATIC_STRUCTS;
  2578. sLevelIDs[1] = RENDER_STATIC_ROOF;
  2579. sLevelIDs[2] = RENDER_STATIC_ONROOF;
  2580. sLevelIDs[3] = RENDER_STATIC_TOPMOST;
  2581. RenderTiles( 0, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 4, uiLevelFlags, sLevelIDs );
  2582. //ATE: Do obsucred layer!
  2583. uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
  2584. sLevelIDs[0] = RENDER_STATIC_STRUCTS;
  2585. uiLevelFlags[1] = TILES_STATIC_ONROOF;
  2586. sLevelIDs[1] = RENDER_STATIC_ONROOF;
  2587. RenderTiles( TILES_OBSCURED, gsLStartPointX_M, gsLStartPointY_M, gsLStartPointX_S, gsLStartPointY_S, gsLEndXS, gsLEndYS, 2, uiLevelFlags, sLevelIDs );
  2588. AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
  2589. ResetRenderParameters( );
  2590. }
  2591. void RenderMarkedWorld(void)
  2592. {
  2593. UINT32 uiLevelFlags[4];
  2594. UINT16 sLevelIDs[4];
  2595. CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2596. RestoreBackgroundRects();
  2597. FreeBackgroundRectType(BGND_FLAG_ANIMATED);
  2598. InvalidateBackgroundRects();
  2599. ResetLayerOptimizing();
  2600. uiLevelFlags[0] = TILES_STATIC_LAND;
  2601. uiLevelFlags[1] = TILES_STATIC_OBJECTS;
  2602. sLevelIDs[0] = RENDER_STATIC_LAND;
  2603. sLevelIDs[1] = RENDER_STATIC_OBJECTS;
  2604. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 2, uiLevelFlags, sLevelIDs );
  2605. if(gRenderFlags&RENDER_FLAG_SHADOWS)
  2606. {
  2607. uiLevelFlags[0] = TILES_STATIC_SHADOWS;
  2608. sLevelIDs[0] = RENDER_STATIC_SHADOWS;
  2609. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2610. }
  2611. uiLevelFlags[0] = TILES_STATIC_STRUCTURES;
  2612. sLevelIDs[0] = RENDER_STATIC_STRUCTS;
  2613. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2614. uiLevelFlags[0] = TILES_STATIC_ROOF;
  2615. sLevelIDs[0] = RENDER_STATIC_ROOF;
  2616. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2617. uiLevelFlags[0] = TILES_STATIC_ONROOF;
  2618. sLevelIDs[0] = RENDER_STATIC_ONROOF;
  2619. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2620. uiLevelFlags[0] = TILES_STATIC_TOPMOST;
  2621. sLevelIDs[0] = RENDER_STATIC_TOPMOST;
  2622. RenderTiles(TILES_MARKED, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2623. AddBaseDirtyRect(gsVIEWPORT_START_X, gsVIEWPORT_WINDOW_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_WINDOW_END_Y );
  2624. ResetRenderParameters( );
  2625. }
  2626. void RenderDynamicWorld( )
  2627. {
  2628. UINT8 ubNumLevels;
  2629. UINT32 uiLevelFlags[ 10 ];
  2630. UINT16 sLevelIDs[ 10 ];
  2631. CalcRenderParameters( gsVIEWPORT_START_X, gsVIEWPORT_START_Y, gsVIEWPORT_END_X, gsVIEWPORT_END_Y );
  2632. RestoreBackgroundRects();
  2633. if(!gfTagAnimatedTiles)
  2634. {
  2635. uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
  2636. uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
  2637. uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
  2638. uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
  2639. uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
  2640. uiLevelFlags[5] = TILES_DYNAMIC_HIGHMERCS;
  2641. uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
  2642. uiLevelFlags[7] = TILES_DYNAMIC_ONROOF;
  2643. uiLevelFlags[8] = TILES_DYNAMIC_TOPMOST;
  2644. sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
  2645. sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
  2646. sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
  2647. sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
  2648. sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
  2649. sLevelIDs[5] = RENDER_DYNAMIC_MERCS;
  2650. sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
  2651. sLevelIDs[7] = RENDER_DYNAMIC_ONROOF;
  2652. sLevelIDs[8] = RENDER_DYNAMIC_TOPMOST;
  2653. ubNumLevels = 9;
  2654. }
  2655. else
  2656. {
  2657. gfTagAnimatedTiles=FALSE;
  2658. //uiLevelFlags[0] = TILES_DYNAMIC_LAND;
  2659. uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
  2660. uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
  2661. uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
  2662. uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
  2663. uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
  2664. uiLevelFlags[5] = TILES_DYNAMIC_HIGHMERCS;
  2665. uiLevelFlags[6] = TILES_DYNAMIC_ROOF;
  2666. uiLevelFlags[7] = TILES_DYNAMIC_ONROOF;
  2667. uiLevelFlags[8] = TILES_DYNAMIC_TOPMOST;
  2668. //sLevelIDs[0] = RENDER_DYNAMIC_LAND;
  2669. sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
  2670. sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
  2671. sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
  2672. sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
  2673. sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
  2674. sLevelIDs[5] = RENDER_DYNAMIC_MERCS;
  2675. sLevelIDs[6] = RENDER_DYNAMIC_ROOF;
  2676. sLevelIDs[7] = RENDER_DYNAMIC_ONROOF;
  2677. sLevelIDs[8] = RENDER_DYNAMIC_TOPMOST;
  2678. ubNumLevels = 9;
  2679. }
  2680. RenderTiles(TILES_DIRTY, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, ubNumLevels, uiLevelFlags, sLevelIDs );
  2681. #ifdef JA2EDITOR
  2682. if( !gfEditMode && !gfAniEditMode )
  2683. #endif
  2684. {
  2685. RenderTacticalInterface( );
  2686. }
  2687. SaveBackgroundRects();
  2688. //uiLevelFlags[0] = TILES_DYNAMIC_LAND;
  2689. uiLevelFlags[0] = TILES_DYNAMIC_OBJECTS;
  2690. uiLevelFlags[1] = TILES_DYNAMIC_SHADOWS;
  2691. uiLevelFlags[2] = TILES_DYNAMIC_STRUCT_MERCS;
  2692. uiLevelFlags[3] = TILES_DYNAMIC_MERCS;
  2693. uiLevelFlags[4] = TILES_DYNAMIC_STRUCTURES;
  2694. //sLevelIDs[0] = RENDER_DYNAMIC_LAND;
  2695. sLevelIDs[0] = RENDER_DYNAMIC_OBJECTS;
  2696. sLevelIDs[1] = RENDER_DYNAMIC_SHADOWS;
  2697. sLevelIDs[2] = RENDER_DYNAMIC_STRUCT_MERCS;
  2698. sLevelIDs[3] = RENDER_DYNAMIC_MERCS;
  2699. sLevelIDs[4] = RENDER_DYNAMIC_STRUCTS;
  2700. RenderTiles( 0, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 5, uiLevelFlags , sLevelIDs );
  2701. uiLevelFlags[0] = TILES_DYNAMIC_ROOF;
  2702. uiLevelFlags[1] = TILES_DYNAMIC_HIGHMERCS;
  2703. uiLevelFlags[2] = TILES_DYNAMIC_ONROOF;
  2704. sLevelIDs[0] = RENDER_DYNAMIC_ROOF;
  2705. sLevelIDs[1] = RENDER_DYNAMIC_HIGHMERCS;
  2706. sLevelIDs[2] = RENDER_DYNAMIC_ONROOF;
  2707. RenderTiles(0 , gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 3, uiLevelFlags, sLevelIDs );
  2708. uiLevelFlags[0] = TILES_DYNAMIC_TOPMOST;
  2709. sLevelIDs[0] = RENDER_DYNAMIC_TOPMOST;
  2710. // ATE: check here for mouse over structs.....
  2711. RenderTiles( TILES_DYNAMIC_CHECKFOR_INT_TILE, gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS, 1, uiLevelFlags, sLevelIDs );
  2712. SumAddiviveLayerOptimization( );
  2713. ResetRenderParameters( );
  2714. }
  2715. BOOLEAN HandleScrollDirections( UINT32 ScrollFlags, INT16 sScrollXStep, INT16 sScrollYStep, INT16 *psTempRenderCenterX, INT16 *psTempRenderCenterY, BOOLEAN fCheckOnly )
  2716. {
  2717. BOOLEAN fAGoodMove = FALSE, fMovedPos = FALSE;
  2718. INT16 sTempX_W, sTempY_W;
  2719. BOOLEAN fUpOK, fLeftOK;
  2720. BOOLEAN fDownOK, fRightOK;
  2721. INT16 sTempRenderCenterX, sTempRenderCenterY;
  2722. sTempRenderCenterX = sTempRenderCenterY = 0;
  2723. // This checking sequence just validates the values!
  2724. if ( ScrollFlags & SCROLL_LEFT )
  2725. {
  2726. FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2727. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2728. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2729. fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2730. if ( fMovedPos )
  2731. {
  2732. fAGoodMove = TRUE;
  2733. }
  2734. if ( !fCheckOnly )
  2735. {
  2736. ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
  2737. }
  2738. }
  2739. if ( ScrollFlags & SCROLL_RIGHT )
  2740. {
  2741. FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2742. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2743. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2744. fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2745. if ( fMovedPos )
  2746. {
  2747. fAGoodMove = TRUE;
  2748. }
  2749. if ( !fCheckOnly )
  2750. {
  2751. ScrollBackground(SCROLL_RIGHT, sScrollXStep, sScrollYStep );
  2752. }
  2753. }
  2754. if ( ScrollFlags & SCROLL_UP )
  2755. {
  2756. FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2757. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2758. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2759. fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2760. if ( fMovedPos )
  2761. {
  2762. fAGoodMove = TRUE;
  2763. }
  2764. if ( !fCheckOnly )
  2765. {
  2766. ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
  2767. }
  2768. }
  2769. if ( ScrollFlags & SCROLL_DOWN )
  2770. {
  2771. FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
  2772. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2773. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2774. fMovedPos=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2775. if ( fMovedPos )
  2776. {
  2777. fAGoodMove = TRUE;
  2778. }
  2779. if ( !fCheckOnly )
  2780. {
  2781. ScrollBackground(SCROLL_DOWN, sScrollXStep, sScrollYStep );
  2782. }
  2783. }
  2784. if ( ScrollFlags & SCROLL_UPLEFT )
  2785. {
  2786. // Check up
  2787. FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2788. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2789. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2790. fUpOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2791. // Check left
  2792. FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2793. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2794. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2795. fLeftOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2796. if ( fLeftOK && fUpOK )
  2797. {
  2798. FromScreenToCellCoordinates( (INT16)-sScrollXStep, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2799. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2800. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2801. fAGoodMove = TRUE;
  2802. if ( !fCheckOnly )
  2803. {
  2804. ScrollBackground(SCROLL_UPLEFT, sScrollXStep, sScrollYStep );
  2805. }
  2806. }
  2807. else if ( fUpOK )
  2808. {
  2809. fAGoodMove = TRUE;
  2810. FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2811. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2812. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2813. if ( !fCheckOnly )
  2814. {
  2815. ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
  2816. }
  2817. }
  2818. else if ( fLeftOK )
  2819. {
  2820. fAGoodMove = TRUE;
  2821. FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2822. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2823. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2824. if ( !fCheckOnly )
  2825. {
  2826. ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
  2827. }
  2828. }
  2829. }
  2830. if ( ScrollFlags & SCROLL_UPRIGHT )
  2831. {
  2832. // Check up
  2833. FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2834. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2835. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2836. fUpOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2837. // Check right
  2838. FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2839. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2840. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2841. fRightOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2842. if ( fUpOK && fRightOK )
  2843. {
  2844. FromScreenToCellCoordinates( (INT16)sScrollXStep, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2845. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2846. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2847. fAGoodMove = TRUE;
  2848. if ( !fCheckOnly )
  2849. {
  2850. ScrollBackground(SCROLL_UPRIGHT, sScrollXStep, sScrollYStep );
  2851. }
  2852. }
  2853. else if ( fUpOK )
  2854. {
  2855. fAGoodMove = TRUE;
  2856. FromScreenToCellCoordinates( 0, (INT16)-sScrollYStep, &sTempX_W, &sTempY_W );
  2857. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2858. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2859. if ( !fCheckOnly )
  2860. {
  2861. ScrollBackground(SCROLL_UP, sScrollXStep, sScrollYStep );
  2862. }
  2863. }
  2864. else if ( fRightOK )
  2865. {
  2866. fAGoodMove = TRUE;
  2867. FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2868. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2869. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2870. if ( !fCheckOnly )
  2871. {
  2872. ScrollBackground(SCROLL_RIGHT, sScrollXStep, sScrollYStep );
  2873. }
  2874. }
  2875. }
  2876. if ( ScrollFlags & SCROLL_DOWNLEFT )
  2877. {
  2878. // Check down......
  2879. FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
  2880. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2881. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2882. fDownOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2883. // Check left.....
  2884. FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2885. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2886. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2887. fLeftOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2888. if ( fLeftOK && fDownOK )
  2889. {
  2890. fAGoodMove = TRUE;
  2891. FromScreenToCellCoordinates( (INT16)-sScrollXStep, (INT16)sScrollYStep, &sTempX_W, &sTempY_W );
  2892. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2893. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2894. if ( !fCheckOnly )
  2895. {
  2896. ScrollBackground(SCROLL_DOWNLEFT, sScrollXStep, sScrollYStep );
  2897. }
  2898. }
  2899. else if ( fLeftOK )
  2900. {
  2901. FromScreenToCellCoordinates( (INT16)-sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2902. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2903. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2904. fAGoodMove = TRUE;
  2905. if ( !fCheckOnly )
  2906. {
  2907. ScrollBackground(SCROLL_LEFT, sScrollXStep, sScrollYStep );
  2908. }
  2909. }
  2910. else if ( fDownOK )
  2911. {
  2912. FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
  2913. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2914. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2915. fAGoodMove = TRUE;
  2916. if ( !fCheckOnly )
  2917. {
  2918. ScrollBackground(SCROLL_DOWN, sScrollXStep, sScrollYStep );
  2919. }
  2920. }
  2921. }
  2922. if ( ScrollFlags & SCROLL_DOWNRIGHT )
  2923. {
  2924. // Check right
  2925. FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2926. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2927. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2928. fRightOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2929. // Check down
  2930. FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
  2931. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2932. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2933. fDownOK=ApplyScrolling( sTempRenderCenterX, sTempRenderCenterY, FALSE, fCheckOnly );
  2934. if ( fDownOK && fRightOK )
  2935. {
  2936. FromScreenToCellCoordinates( (INT16)sScrollXStep, (INT16)sScrollYStep, &sTempX_W, &sTempY_W );
  2937. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2938. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2939. fAGoodMove = TRUE;
  2940. if ( !fCheckOnly )
  2941. {
  2942. ScrollBackground( SCROLL_DOWNRIGHT, sScrollXStep, sScrollYStep );
  2943. }
  2944. }
  2945. else if ( fDownOK )
  2946. {
  2947. FromScreenToCellCoordinates( 0, sScrollYStep, &sTempX_W, &sTempY_W );
  2948. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2949. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2950. fAGoodMove = TRUE;
  2951. if ( !fCheckOnly )
  2952. {
  2953. ScrollBackground( SCROLL_DOWN, sScrollXStep, sScrollYStep );
  2954. }
  2955. }
  2956. else if ( fRightOK )
  2957. {
  2958. FromScreenToCellCoordinates( sScrollXStep, 0, &sTempX_W, &sTempY_W );
  2959. sTempRenderCenterX = gsRenderCenterX + sTempX_W;
  2960. sTempRenderCenterY = gsRenderCenterY + sTempY_W;
  2961. fAGoodMove = TRUE;
  2962. if ( !fCheckOnly )
  2963. {
  2964. ScrollBackground( SCROLL_RIGHT, sScrollXStep, sScrollYStep );
  2965. }
  2966. }
  2967. }
  2968. ( *psTempRenderCenterX ) = sTempRenderCenterX;
  2969. ( *psTempRenderCenterY ) = sTempRenderCenterY;
  2970. return( fAGoodMove );
  2971. }
  2972. void ScrollWorld( )
  2973. {
  2974. UINT32 ScrollFlags = 0;
  2975. BOOLEAN fDoScroll = FALSE, fMovedPos=FALSE, fAGoodMove = FALSE;
  2976. INT16 sTempRenderCenterX, sTempRenderCenterY;
  2977. INT8 bDirection;
  2978. INT16 sScrollXStep=-1;
  2979. INT16 sScrollYStep=-1;
  2980. BOOLEAN fIgnoreInput = FALSE;
  2981. static UINT8 ubOldScrollSpeed = 0;
  2982. static BOOLEAN fFirstTimeInSlideToMode = TRUE;
  2983. if ( gfIgnoreScrollDueToCenterAdjust )
  2984. {
  2985. // gfIgnoreScrollDueToCenterAdjust = FALSE;
  2986. return;
  2987. }
  2988. if ( gfIgnoreScrolling == 1 )
  2989. {
  2990. return;
  2991. }
  2992. if ( gfIgnoreScrolling == 2 )
  2993. {
  2994. fIgnoreInput = TRUE;
  2995. }
  2996. if ( gCurrentUIMode == LOCKUI_MODE )
  2997. {
  2998. fIgnoreInput = TRUE;
  2999. }
  3000. // If in editor, ignore scrolling if any of the shift keys pressed with arrow keys
  3001. if ( gfEditMode && ( _KeyDown(CTRL) || _KeyDown(ALT) ) )
  3002. return;
  3003. // Ignore if ALT DONW
  3004. if ( _KeyDown( ALT ) )
  3005. return;
  3006. do
  3007. {
  3008. if ( gfIgnoreScrolling != 3 )
  3009. {
  3010. // Check for sliding
  3011. if ( gTacticalStatus.sSlideTarget != NOWHERE )
  3012. {
  3013. // Ignore all input...
  3014. // Check if we have reached out dest!
  3015. if ( fFirstTimeInSlideToMode )
  3016. {
  3017. ubOldScrollSpeed = gubCurScrollSpeedID;
  3018. fFirstTimeInSlideToMode = FALSE;
  3019. }
  3020. // Make faster!
  3021. //gubCurScrollSpeedID = 2;
  3022. ScrollFlags = 0;
  3023. fDoScroll = FALSE;
  3024. //
  3025. if ( SoldierLocationRelativeToScreen( gTacticalStatus.sSlideTarget, gTacticalStatus.sSlideReason, &bDirection, &ScrollFlags ) && GridNoOnVisibleWorldTile( gTacticalStatus.sSlideTarget ) )
  3026. {
  3027. ScrollFlags = gScrollDirectionFlags[ bDirection ];
  3028. fDoScroll = TRUE;
  3029. fIgnoreInput = TRUE;
  3030. }
  3031. else
  3032. {
  3033. // We've stopped!
  3034. gTacticalStatus.sSlideTarget = NOWHERE;
  3035. }
  3036. }
  3037. else
  3038. {
  3039. // Restore old scroll speed
  3040. if ( !fFirstTimeInSlideToMode )
  3041. {
  3042. gubCurScrollSpeedID = ubOldScrollSpeed;
  3043. }
  3044. fFirstTimeInSlideToMode = TRUE;
  3045. }
  3046. }
  3047. if ( !fIgnoreInput )
  3048. {
  3049. // Check keys
  3050. if ( _KeyDown( UPARROW ) )
  3051. {
  3052. fDoScroll = TRUE;
  3053. ScrollFlags |= SCROLL_UP;
  3054. }
  3055. if ( _KeyDown( DNARROW ) )
  3056. {
  3057. fDoScroll = TRUE;
  3058. ScrollFlags |= SCROLL_DOWN;
  3059. }
  3060. if ( _KeyDown( RIGHTARROW ) )
  3061. {
  3062. fDoScroll = TRUE;
  3063. ScrollFlags |= SCROLL_RIGHT;
  3064. }
  3065. if ( _KeyDown( LEFTARROW ) )
  3066. {
  3067. fDoScroll = TRUE;
  3068. ScrollFlags |= SCROLL_LEFT;
  3069. }
  3070. // Do mouse - PUT INTO A TIMER!
  3071. // Put a counter on starting from mouse, if we have not started already!
  3072. if ( !gfScrollInertia && gfScrollPending == FALSE )
  3073. {
  3074. if ( !COUNTERDONE( STARTSCROLL ) )
  3075. {
  3076. break;
  3077. }
  3078. RESETCOUNTER( STARTSCROLL );
  3079. }
  3080. if ( gusMouseYPos == 0 )
  3081. {
  3082. fDoScroll = TRUE;
  3083. ScrollFlags |= SCROLL_UP;
  3084. }
  3085. if ( gusMouseYPos >= 479 )
  3086. {
  3087. fDoScroll = TRUE;
  3088. ScrollFlags |= SCROLL_DOWN;
  3089. }
  3090. if ( gusMouseXPos >= 639 )
  3091. {
  3092. fDoScroll = TRUE;
  3093. ScrollFlags |= SCROLL_RIGHT;
  3094. }
  3095. if ( gusMouseXPos == 0 )
  3096. {
  3097. fDoScroll = TRUE;
  3098. ScrollFlags |= SCROLL_LEFT;
  3099. }
  3100. }
  3101. } while( FALSE );
  3102. if ( fDoScroll )
  3103. {
  3104. if ( gfDoSubtileScroll )
  3105. {
  3106. if ( gfScrollInertia > gubNewScrollIDSpeeds[ gubCurScrollSpeedID ] )
  3107. {
  3108. gubCurScrollSpeedID++;
  3109. if ( gubCurScrollSpeedID > gubScrollSpeedEndID )
  3110. {
  3111. gubCurScrollSpeedID = gubScrollSpeedEndID;
  3112. }
  3113. }
  3114. }
  3115. //if ( !gfDoVideoScroll )
  3116. //{
  3117. // gubCurScrollSpeedID = 4;
  3118. //}
  3119. // Adjust speed based on whether shift is down
  3120. if ( _KeyDown( SHIFT ) )
  3121. {
  3122. sScrollXStep = gubNewScrollXSpeeds[ gfDoVideoScroll ][ 3 ];
  3123. sScrollYStep = gubNewScrollYSpeeds[ gfDoVideoScroll ][ 3 ];
  3124. }
  3125. else
  3126. {
  3127. sScrollXStep = gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
  3128. sScrollYStep = gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
  3129. }
  3130. // Set diagonal flags!
  3131. if ( ( ScrollFlags & SCROLL_LEFT ) && ( ScrollFlags & SCROLL_UP ) )
  3132. {
  3133. ScrollFlags = SCROLL_UPLEFT;
  3134. }
  3135. if ( ( ScrollFlags & SCROLL_RIGHT ) && ( ScrollFlags & SCROLL_UP ) )
  3136. {
  3137. ScrollFlags = SCROLL_UPRIGHT;
  3138. }
  3139. if ( ( ScrollFlags & SCROLL_LEFT ) && ( ScrollFlags & SCROLL_DOWN ) )
  3140. {
  3141. ScrollFlags = SCROLL_DOWNLEFT;
  3142. }
  3143. if ( ( ScrollFlags & SCROLL_RIGHT ) && ( ScrollFlags & SCROLL_DOWN ) )
  3144. {
  3145. ScrollFlags = SCROLL_DOWNRIGHT;
  3146. }
  3147. fAGoodMove = HandleScrollDirections( ScrollFlags, sScrollXStep, sScrollYStep, &sTempRenderCenterX, &sTempRenderCenterY, TRUE );
  3148. }
  3149. // Has this been an OK scroll?
  3150. if ( fAGoodMove )
  3151. {
  3152. if ( COUNTERDONE( NEXTSCROLL ) )
  3153. {
  3154. RESETCOUNTER( NEXTSCROLL );
  3155. // Are we starting a new scroll?
  3156. if ( gfScrollInertia == 0 && gfScrollPending == FALSE )
  3157. {
  3158. // We are starting to scroll - setup scroll pending
  3159. gfScrollPending = TRUE;
  3160. // Remove any interface stuff
  3161. ClearInterface( );
  3162. // Return so that next frame things will be erased!
  3163. return;
  3164. }
  3165. // If here, set scroll pending to false
  3166. gfScrollPending = FALSE;
  3167. // INcrement scroll intertia
  3168. gfScrollInertia++;
  3169. // Now we actually begin our scrolling
  3170. HandleScrollDirections( ScrollFlags, sScrollXStep, sScrollYStep, &sTempRenderCenterX, &sTempRenderCenterY, FALSE );
  3171. }
  3172. }
  3173. else
  3174. {
  3175. // ATE: Also if scroll pending never got to scroll....
  3176. if ( gfScrollPending == TRUE )
  3177. {
  3178. // Do a complete rebuild!
  3179. gfScrollPending = FALSE;
  3180. // Restore Interface!
  3181. RestoreInterface( );
  3182. // Delete Topmost blitters saved areas
  3183. DeleteVideoOverlaysArea( );
  3184. }
  3185. // Check if we have just stopped scrolling!
  3186. if ( gfScrollInertia != FALSE )
  3187. {
  3188. SetRenderFlags( RENDER_FLAG_FULL | RENDER_FLAG_CHECKZ );
  3189. // Restore Interface!
  3190. RestoreInterface( );
  3191. // Delete Topmost blitters saved areas
  3192. DeleteVideoOverlaysArea( );
  3193. }
  3194. gfScrollInertia = FALSE;
  3195. gfScrollPending = FALSE;
  3196. if ( gfDoSubtileScroll )
  3197. {
  3198. gubCurScrollSpeedID = gubScrollSpeedStartID;
  3199. }
  3200. }
  3201. }
  3202. void InitRenderParams( UINT8 ubRestrictionID )
  3203. {
  3204. INT16 gsTilesX, gsTilesY;
  3205. UINT32 cnt, cnt2;
  3206. DOUBLE dWorldX, dWorldY;
  3207. switch( ubRestrictionID )
  3208. {
  3209. case 0: //Default!
  3210. gTopLeftWorldLimitX = CELL_X_SIZE;
  3211. gTopLeftWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
  3212. gTopRightWorldLimitX = ( WORLD_COLS / 2 ) * CELL_Y_SIZE;
  3213. gTopRightWorldLimitY = CELL_X_SIZE;
  3214. gBottomLeftWorldLimitX = ( ( WORLD_COLS / 2 ) * CELL_Y_SIZE );
  3215. gBottomLeftWorldLimitY = ( WORLD_ROWS * CELL_Y_SIZE );
  3216. gBottomRightWorldLimitX = ( WORLD_COLS * CELL_Y_SIZE );
  3217. gBottomRightWorldLimitY = ( ( WORLD_ROWS / 2 ) * CELL_X_SIZE );
  3218. break;
  3219. case 1: // BAEMENT LEVEL 1
  3220. gTopLeftWorldLimitX = ( 3 * WORLD_ROWS / 10 ) * CELL_X_SIZE;
  3221. gTopLeftWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
  3222. gTopRightWorldLimitX = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
  3223. gTopRightWorldLimitY = ( 3 * WORLD_COLS / 10 ) * CELL_X_SIZE;
  3224. gBottomLeftWorldLimitX = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
  3225. gBottomLeftWorldLimitY = ( 7 * WORLD_COLS / 10 ) * CELL_X_SIZE;
  3226. gBottomRightWorldLimitX = ( 7 * WORLD_ROWS / 10 ) * CELL_X_SIZE;
  3227. gBottomRightWorldLimitY = ( WORLD_ROWS / 2 ) * CELL_X_SIZE;
  3228. break;
  3229. }
  3230. gCenterWorldX = ( WORLD_ROWS ) / 2 * CELL_X_SIZE;
  3231. gCenterWorldY = ( WORLD_COLS ) / 2 * CELL_Y_SIZE;
  3232. // Convert Bounding box into screen coords
  3233. FromCellToScreenCoordinates( gTopLeftWorldLimitX, gTopLeftWorldLimitY, &gsTLX, &gsTLY );
  3234. FromCellToScreenCoordinates( gTopRightWorldLimitX, gTopRightWorldLimitY, &gsTRX, &gsTRY );
  3235. FromCellToScreenCoordinates( gBottomLeftWorldLimitX, gBottomLeftWorldLimitY, &gsBLX, &gsBLY );
  3236. FromCellToScreenCoordinates( gBottomRightWorldLimitX, gBottomRightWorldLimitY, &gsBRX, &gsBRY );
  3237. FromCellToScreenCoordinates( gCenterWorldX , gCenterWorldY, &gsCX, &gsCY );
  3238. // Adjust for interface height tabbing!
  3239. gsTLY += ROOF_LEVEL_HEIGHT;
  3240. gsTRY += ROOF_LEVEL_HEIGHT;
  3241. gsCY += ( ROOF_LEVEL_HEIGHT / 2 );
  3242. // Take these spaning distances and determine # tiles spaning
  3243. gsTilesX = ( gsTRX - gsTLX ) / WORLD_TILE_X;
  3244. gsTilesY = ( gsBRY - gsTRY ) / WORLD_TILE_Y;
  3245. DebugMsg(TOPIC_JA2, DBG_LEVEL_0, String("World Screen Width %d Height %d", ( gsTRX - gsTLX ), ( gsBRY - gsTRY )));
  3246. // Determine scale factors
  3247. // First scale world screen coords for VIEWPORT ratio
  3248. dWorldX = (DOUBLE)( gsTRX - gsTLX );
  3249. dWorldY = (DOUBLE)( gsBRY - gsTRY );
  3250. gdScaleX = (DOUBLE)RADAR_WINDOW_WIDTH / dWorldX;
  3251. gdScaleY = (DOUBLE)RADAR_WINDOW_HEIGHT / dWorldY;
  3252. for ( cnt = 0, cnt2 = 0; cnt2 < NUM_ITEM_CYCLE_COLORS; cnt+=3, cnt2++ )
  3253. {
  3254. us16BPPItemCycleWhiteColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleWhiteColors[ cnt ], ubRGBItemCycleWhiteColors[ cnt + 1 ], ubRGBItemCycleWhiteColors[ cnt + 2] ) );
  3255. us16BPPItemCycleRedColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleRedColors[ cnt ], ubRGBItemCycleRedColors[ cnt + 1 ], ubRGBItemCycleRedColors[ cnt + 2] ) );
  3256. us16BPPItemCycleYellowColors[ cnt2 ] = Get16BPPColor( FROMRGB( ubRGBItemCycleYellowColors[ cnt ], ubRGBItemCycleYellowColors[ cnt + 1 ], ubRGBItemCycleYellowColors[ cnt + 2] ) );
  3257. }
  3258. gsLobOutline = Get16BPPColor( FROMRGB( 10, 200, 10 ) );
  3259. gsThrowOutline = Get16BPPColor( FROMRGB( 253, 212, 10 ) );
  3260. gsGiveOutline = Get16BPPColor( FROMRGB( 253, 0, 0 ) );
  3261. gusNormalItemOutlineColor = Get16BPPColor( FROMRGB( 255, 255, 255 ) );
  3262. gusYellowItemOutlineColor = Get16BPPColor( FROMRGB( 255, 255, 0 ) );
  3263. // NOW GET DISTANCE SPANNING WORLD LIMITS IN WORLD COORDS
  3264. //FromScreenToCellCoordinates( ( gTopRightWorldLimitX - gTopLeftWorldLimitX ), ( gTopRightWorldLimitY - gTopLeftWorldLimitY ), &gsWorldSpanX, &gsWorldSpanY );
  3265. // CALCULATE 16BPP COLORS FOR ITEMS
  3266. }
  3267. // Appy? HEahehahehahehae.....
  3268. BOOLEAN ApplyScrolling( INT16 sTempRenderCenterX, INT16 sTempRenderCenterY, BOOLEAN fForceAdjust, BOOLEAN fCheckOnly )
  3269. {
  3270. BOOLEAN fScrollGood = FALSE;
  3271. BOOLEAN fOutLeft = FALSE;
  3272. BOOLEAN fOutRight = FALSE;
  3273. BOOLEAN fOutTop = FALSE;
  3274. BOOLEAN fOutBottom = FALSE;
  3275. double dOpp, dAdj, dAngle;
  3276. INT16 sTopLeftWorldX, sTopLeftWorldY;
  3277. INT16 sTopRightWorldX, sTopRightWorldY;
  3278. INT16 sBottomLeftWorldX, sBottomLeftWorldY;
  3279. INT16 sBottomRightWorldX, sBottomRightWorldY;
  3280. INT16 sTempPosX_W, sTempPosY_W;
  3281. // For debug text for all 4 angles
  3282. double at1, at2, at3, at4;
  3283. INT16 sX_S, sY_S;
  3284. INT16 sScreenCenterX, sScreenCenterY;
  3285. INT16 sDistToCenterY, sDistToCenterX;
  3286. INT16 sNewScreenX, sNewScreenY;
  3287. INT16 sMult;
  3288. //Makesure it's a multiple of 5
  3289. sMult = sTempRenderCenterX / CELL_X_SIZE;
  3290. sTempRenderCenterX = ( sMult * CELL_X_SIZE ) + ( CELL_X_SIZE / 2 );
  3291. //Makesure it's a multiple of 5
  3292. sMult = sTempRenderCenterY / CELL_X_SIZE;
  3293. sTempRenderCenterY = ( sMult * CELL_Y_SIZE ) + ( CELL_Y_SIZE / 2 );
  3294. // Find the diustance from render center to true world center
  3295. sDistToCenterX = sTempRenderCenterX - gCenterWorldX;
  3296. sDistToCenterY = sTempRenderCenterY - gCenterWorldY;
  3297. // From render center in world coords, convert to render center in "screen" coords
  3298. FromCellToScreenCoordinates( sDistToCenterX , sDistToCenterY, &sScreenCenterX, &sScreenCenterY );
  3299. // Subtract screen center
  3300. sScreenCenterX += gsCX;
  3301. sScreenCenterY += gsCY;
  3302. // Adjust for offset position on screen
  3303. sScreenCenterX -= 0;
  3304. sScreenCenterY -= 10;
  3305. // Get corners in screen coords
  3306. // TOP LEFT
  3307. sX_S = ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2;
  3308. sY_S = ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2;
  3309. sTopLeftWorldX = sScreenCenterX - sX_S;
  3310. sTopLeftWorldY = sScreenCenterY - sY_S;
  3311. sTopRightWorldX = sScreenCenterX + sX_S;
  3312. sTopRightWorldY = sScreenCenterY - sY_S;
  3313. sBottomLeftWorldX = sScreenCenterX - sX_S;
  3314. sBottomLeftWorldY = sScreenCenterY + sY_S;
  3315. sBottomRightWorldX = sScreenCenterX + sX_S;
  3316. sBottomRightWorldY = sScreenCenterY + sY_S;
  3317. // Get angles
  3318. // TOP LEFT CORNER FIRST
  3319. dOpp = sTopLeftWorldY - gsTLY;
  3320. dAdj = sTopLeftWorldX - gsTLX;
  3321. dAngle = (double)atan2( dAdj, dOpp );
  3322. at1 = dAngle * 180 / PI;
  3323. if ( dAngle < 0 )
  3324. {
  3325. fOutLeft = TRUE;
  3326. }
  3327. else if ( dAngle > PI/2 )
  3328. {
  3329. fOutTop = TRUE;
  3330. }
  3331. // TOP RIGHT CORNER
  3332. dOpp = sTopRightWorldY - gsTRY;
  3333. dAdj = gsTRX - sTopRightWorldX;
  3334. dAngle = (double)atan2( dAdj, dOpp );
  3335. at2 = dAngle * 180 / PI;
  3336. if ( dAngle < 0 )
  3337. {
  3338. fOutRight = TRUE;
  3339. }
  3340. else if ( dAngle > PI/2 )
  3341. {
  3342. fOutTop = TRUE;
  3343. }
  3344. // BOTTOM LEFT CORNER
  3345. dOpp = gsBLY - sBottomLeftWorldY;
  3346. dAdj = sBottomLeftWorldX - gsBLX;
  3347. dAngle = (double)atan2( dAdj, dOpp );
  3348. at3 = dAngle * 180 / PI;
  3349. if ( dAngle < 0 )
  3350. {
  3351. fOutLeft = TRUE;
  3352. }
  3353. else if ( dAngle > PI/2 )
  3354. {
  3355. fOutBottom = TRUE;
  3356. }
  3357. // BOTTOM RIGHT CORNER
  3358. dOpp = gsBRY - sBottomRightWorldY;
  3359. dAdj = gsBRX - sBottomRightWorldX;
  3360. dAngle = (double)atan2( dAdj, dOpp );
  3361. at4 = dAngle * 180 / PI;
  3362. if ( dAngle < 0 )
  3363. {
  3364. fOutRight = TRUE;
  3365. }
  3366. else if ( dAngle > PI/2 )
  3367. {
  3368. fOutBottom = TRUE;
  3369. }
  3370. sprintf( gDebugStr, "Angles: %d %d %d %d", (int)at1, (int)at2, (int)at3, (int)at4 );
  3371. if ( !fOutRight && !fOutLeft && !fOutTop && !fOutBottom )
  3372. {
  3373. fScrollGood = TRUE;
  3374. }
  3375. // If in editor, anything goes
  3376. if ( gfEditMode && _KeyDown( SHIFT ) )
  3377. {
  3378. fScrollGood = TRUE;
  3379. }
  3380. // Reset some UI flags
  3381. gfUIShowExitEast = FALSE;
  3382. gfUIShowExitWest = FALSE;
  3383. gfUIShowExitNorth = FALSE;
  3384. gfUIShowExitSouth = FALSE;
  3385. if ( !fScrollGood )
  3386. {
  3387. // Force adjustment, if true
  3388. if ( fForceAdjust )
  3389. {
  3390. if ( fOutTop )
  3391. {
  3392. // Adjust screen coordinates on the Y!
  3393. CorrectRenderCenter( sScreenCenterX, (INT16)(gsTLY + sY_S ), &sNewScreenX, &sNewScreenY );
  3394. FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
  3395. sTempRenderCenterX = sTempPosX_W;
  3396. sTempRenderCenterY = sTempPosY_W;
  3397. fScrollGood = TRUE;
  3398. }
  3399. if ( fOutBottom )
  3400. {
  3401. // OK, Ajust this since we get rounding errors in our two different calculations.
  3402. CorrectRenderCenter( sScreenCenterX, (INT16)(gsBLY - sY_S - 50 ), &sNewScreenX, &sNewScreenY );
  3403. FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
  3404. sTempRenderCenterX = sTempPosX_W;
  3405. sTempRenderCenterY = sTempPosY_W;
  3406. fScrollGood = TRUE;
  3407. }
  3408. if ( fOutLeft )
  3409. {
  3410. CorrectRenderCenter( (INT16)( gsTLX + sX_S ) , sScreenCenterY , &sNewScreenX, &sNewScreenY );
  3411. FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
  3412. sTempRenderCenterX = sTempPosX_W;
  3413. sTempRenderCenterY = sTempPosY_W;
  3414. fScrollGood = TRUE;
  3415. }
  3416. if ( fOutRight )
  3417. {
  3418. CorrectRenderCenter( (INT16)( gsTRX - sX_S ) , sScreenCenterY , &sNewScreenX, &sNewScreenY );
  3419. FromScreenToCellCoordinates( sNewScreenX, sNewScreenY , &sTempPosX_W, &sTempPosY_W );
  3420. sTempRenderCenterX = sTempPosX_W;
  3421. sTempRenderCenterY = sTempPosY_W;
  3422. fScrollGood = TRUE;
  3423. }
  3424. }
  3425. else
  3426. {
  3427. if ( fOutRight )
  3428. {
  3429. // Check where our cursor is!
  3430. if ( gusMouseXPos >= 639 )
  3431. {
  3432. gfUIShowExitEast = TRUE;
  3433. }
  3434. }
  3435. if ( fOutLeft )
  3436. {
  3437. // Check where our cursor is!
  3438. if ( gusMouseXPos == 0 )
  3439. {
  3440. gfUIShowExitWest = TRUE;
  3441. }
  3442. }
  3443. if ( fOutTop )
  3444. {
  3445. // Check where our cursor is!
  3446. if ( gusMouseYPos == 0 )
  3447. {
  3448. gfUIShowExitNorth = TRUE;
  3449. }
  3450. }
  3451. if ( fOutBottom )
  3452. {
  3453. // Check where our cursor is!
  3454. if ( gusMouseYPos >= 479 )
  3455. {
  3456. gfUIShowExitSouth = TRUE;
  3457. }
  3458. }
  3459. }
  3460. }
  3461. if ( fScrollGood )
  3462. {
  3463. if ( !fCheckOnly )
  3464. {
  3465. sprintf( gDebugStr, "Center: %d %d ", (int)gsRenderCenterX, (int)gsRenderCenterY );
  3466. //Makesure it's a multiple of 5
  3467. sMult = sTempRenderCenterX / CELL_X_SIZE;
  3468. gsRenderCenterX = ( sMult * CELL_X_SIZE ) + ( CELL_X_SIZE / 2 );
  3469. //Makesure it's a multiple of 5
  3470. sMult = sTempRenderCenterY / CELL_X_SIZE;
  3471. gsRenderCenterY = ( sMult * CELL_Y_SIZE ) + ( CELL_Y_SIZE / 2 );
  3472. //gsRenderCenterX = sTempRenderCenterX;
  3473. //gsRenderCenterY = sTempRenderCenterY;
  3474. gsTopLeftWorldX = sTopLeftWorldX - gsTLX;
  3475. gsTopLeftWorldY = sTopLeftWorldY - gsTLY;
  3476. gsTopRightWorldX = sTopRightWorldX - gsTLX;
  3477. gsTopRightWorldY = sTopRightWorldY - gsTLY;
  3478. gsBottomLeftWorldX = sBottomLeftWorldX - gsTLX;
  3479. gsBottomLeftWorldY = sBottomLeftWorldY - gsTLY;
  3480. gsBottomRightWorldX = sBottomRightWorldX - gsTLX;
  3481. gsBottomRightWorldY = sBottomRightWorldY - gsTLY;
  3482. SetPositionSndsVolumeAndPanning( );
  3483. }
  3484. return( TRUE );
  3485. }
  3486. return( FALSE );
  3487. }
  3488. void ClearMarkedTiles(void)
  3489. {
  3490. UINT32 uiCount;
  3491. for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
  3492. gpWorldLevelData[uiCount].uiFlags&=(~MAPELEMENT_REDRAW);
  3493. }
  3494. // @@ATECLIP TO WORLD!
  3495. void InvalidateWorldRedundencyRadius(INT16 sX, INT16 sY, INT16 sRadius)
  3496. {
  3497. INT16 sCountX, sCountY;
  3498. UINT32 uiTile;
  3499. SetRenderFlags( RENDER_FLAG_CHECKZ );
  3500. for(sCountY=sY-sRadius; sCountY < (sY+sRadius+2); sCountY++)
  3501. {
  3502. for(sCountX=sX-sRadius; sCountX < (sX+sRadius+2); sCountX++)
  3503. {
  3504. uiTile=FASTMAPROWCOLTOPOS(sCountY, sCountX);
  3505. gpWorldLevelData[uiTile].uiFlags |= MAPELEMENT_REEVALUATE_REDUNDENCY;
  3506. }
  3507. }
  3508. }
  3509. void InvalidateWorldRedundency( )
  3510. {
  3511. UINT32 uiCount;
  3512. SetRenderFlags( RENDER_FLAG_CHECKZ );
  3513. for(uiCount=0; uiCount < WORLD_MAX; uiCount++)
  3514. gpWorldLevelData[uiCount].uiFlags |= MAPELEMENT_REEVALUATE_REDUNDENCY;
  3515. }
  3516. #define Z_STRIP_DELTA_Y ( Z_SUBLAYERS * 10 )
  3517. /**********************************************************************************************
  3518. Blt8BPPDataTo16BPPBufferTransZIncClip
  3519. Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
  3520. buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
  3521. pixel's Z level is below that of the current pixel, it is written on, and the Z value is
  3522. updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
  3523. must be the same dimensions (including Pitch) as the destination.
  3524. **********************************************************************************************/
  3525. BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
  3526. {
  3527. UINT16 *p16BPPPalette;
  3528. UINT32 uiOffset;
  3529. UINT32 usHeight, usWidth, Unblitted;
  3530. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  3531. UINT32 LineSkip;
  3532. ETRLEObject *pTrav;
  3533. INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
  3534. INT32 ClipX1, ClipY1, ClipX2, ClipY2;
  3535. UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
  3536. INT8 *pZArray;
  3537. ZStripInfo *pZInfo;
  3538. // Assertions
  3539. Assert( hSrcVObject != NULL );
  3540. Assert( pBuffer != NULL );
  3541. // Get Offsets from Index into structure
  3542. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  3543. usHeight = (UINT32)pTrav->usHeight;
  3544. usWidth = (UINT32)pTrav->usWidth;
  3545. uiOffset = pTrav->uiDataOffset;
  3546. // Add to start position of dest buffer
  3547. iTempX = iX + pTrav->sOffsetX;
  3548. iTempY = iY + pTrav->sOffsetY;
  3549. if(clipregion==NULL)
  3550. {
  3551. ClipX1=ClippingRect.iLeft;
  3552. ClipY1=ClippingRect.iTop;
  3553. ClipX2=ClippingRect.iRight;
  3554. ClipY2=ClippingRect.iBottom;
  3555. }
  3556. else
  3557. {
  3558. ClipX1=clipregion->iLeft;
  3559. ClipY1=clipregion->iTop;
  3560. ClipX2=clipregion->iRight;
  3561. ClipY2=clipregion->iBottom;
  3562. }
  3563. // Calculate rows hanging off each side of the screen
  3564. LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
  3565. RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
  3566. TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
  3567. BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
  3568. // calculate the remaining rows and columns to blit
  3569. BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
  3570. BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
  3571. // check if whole thing is clipped
  3572. if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
  3573. return(TRUE);
  3574. // check if whole thing is clipped
  3575. if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
  3576. return(TRUE);
  3577. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  3578. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  3579. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  3580. p16BPPPalette = hSrcVObject->pShadeCurrent;
  3581. LineSkip=(uiDestPitchBYTES-(BlitLength*2));
  3582. if(hSrcVObject->ppZStripInfo==NULL)
  3583. {
  3584. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  3585. return(FALSE);
  3586. }
  3587. // setup for the z-column blitting stuff
  3588. pZInfo=hSrcVObject->ppZStripInfo[usIndex];
  3589. if(pZInfo==NULL)
  3590. {
  3591. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  3592. return(FALSE);
  3593. }
  3594. usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
  3595. // set to odd number of pixels for first column
  3596. if(LeftSkip > pZInfo->ubFirstZStripWidth)
  3597. {
  3598. usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
  3599. usZStartCols=20-(usZStartCols%20);
  3600. }
  3601. else if(LeftSkip < pZInfo->ubFirstZStripWidth)
  3602. usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
  3603. else
  3604. usZStartCols=20;
  3605. usZColsToGo=usZStartCols;
  3606. pZArray=pZInfo->pbZChange;
  3607. if(LeftSkip >= pZInfo->ubFirstZStripWidth)
  3608. {
  3609. // Index into array after doing left clipping
  3610. usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
  3611. //calculates the Z-value after left-side clipping
  3612. if(usZStartIndex)
  3613. {
  3614. for(usCount=0; usCount < usZStartIndex; usCount++)
  3615. {
  3616. switch(pZArray[usCount])
  3617. {
  3618. case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
  3619. break;
  3620. case 0: //no change
  3621. break;
  3622. case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
  3623. break;
  3624. }
  3625. }
  3626. }
  3627. }
  3628. else
  3629. usZStartIndex=0;
  3630. usZLevel=usZStartLevel;
  3631. usZIndex=usZStartIndex;
  3632. __asm {
  3633. mov esi, SrcPtr
  3634. mov edi, DestPtr
  3635. mov edx, p16BPPPalette
  3636. xor eax, eax
  3637. mov ebx, ZPtr
  3638. xor ecx, ecx
  3639. cmp TopSkip, 0 // check for nothing clipped on top
  3640. je LeftSkipSetup
  3641. // Skips the number of lines clipped at the top
  3642. TopSkipLoop:
  3643. mov cl, [esi]
  3644. inc esi
  3645. or cl, cl
  3646. js TopSkipLoop
  3647. jz TSEndLine
  3648. add esi, ecx
  3649. jmp TopSkipLoop
  3650. TSEndLine:
  3651. dec TopSkip
  3652. jnz TopSkipLoop
  3653. // Start of line loop
  3654. // Skips the pixels hanging outside the left-side boundry
  3655. LeftSkipSetup:
  3656. mov Unblitted, 0 // Unblitted counts any pixels left from a run
  3657. mov eax, LeftSkip // after we have skipped enough left-side pixels
  3658. mov LSCount, eax // LSCount counts how many pixels skipped so far
  3659. or eax, eax
  3660. jz BlitLineSetup // check for nothing to skip
  3661. LeftSkipLoop:
  3662. mov cl, [esi]
  3663. inc esi
  3664. or cl, cl
  3665. js LSTrans
  3666. cmp ecx, LSCount
  3667. je LSSkip2 // if equal, skip whole, and start blit with new run
  3668. jb LSSkip1 // if less, skip whole thing
  3669. add esi, LSCount // skip partial run, jump into normal loop for rest
  3670. sub ecx, LSCount
  3671. mov eax, BlitLength
  3672. mov LSCount, eax
  3673. mov Unblitted, 0
  3674. jmp BlitNTL1 // *** jumps into non-transparent blit loop
  3675. LSSkip2:
  3676. add esi, ecx // skip whole run, and start blit with new run
  3677. jmp BlitLineSetup
  3678. LSSkip1:
  3679. add esi, ecx // skip whole run, continue skipping
  3680. sub LSCount, ecx
  3681. jmp LeftSkipLoop
  3682. LSTrans:
  3683. and ecx, 07fH
  3684. cmp ecx, LSCount
  3685. je BlitLineSetup // if equal, skip whole, and start blit with new run
  3686. jb LSTrans1 // if less, skip whole thing
  3687. sub ecx, LSCount // skip partial run, jump into normal loop for rest
  3688. mov eax, BlitLength
  3689. mov LSCount, eax
  3690. mov Unblitted, 0
  3691. jmp BlitTransparent // *** jumps into transparent blit loop
  3692. LSTrans1:
  3693. sub LSCount, ecx // skip whole run, continue skipping
  3694. jmp LeftSkipLoop
  3695. //-------------------------------------------------
  3696. // setup for beginning of line
  3697. BlitLineSetup:
  3698. mov eax, BlitLength
  3699. mov LSCount, eax
  3700. mov Unblitted, 0
  3701. BlitDispatch:
  3702. cmp LSCount, 0 // Check to see if we're done blitting
  3703. je RightSkipLoop
  3704. mov cl, [esi]
  3705. inc esi
  3706. or cl, cl
  3707. js BlitTransparent
  3708. jz RSLoop2
  3709. //--------------------------------
  3710. // blitting non-transparent pixels
  3711. and ecx, 07fH
  3712. BlitNTL1:
  3713. mov ax, [ebx] // check z-level of pixel
  3714. cmp ax, usZLevel
  3715. jae BlitNTL2
  3716. mov ax, usZLevel // update z-level of pixel
  3717. mov [ebx], ax
  3718. xor eax, eax
  3719. mov al, [esi] // copy pixel
  3720. mov ax, [edx+eax*2]
  3721. mov [edi], ax
  3722. BlitNTL2:
  3723. inc esi
  3724. add edi, 2
  3725. add ebx, 2
  3726. dec usZColsToGo
  3727. jnz BlitNTL6
  3728. // update the z-level according to the z-table
  3729. push edx
  3730. mov edx, pZArray // get pointer to array
  3731. xor eax, eax
  3732. mov ax, usZIndex // pick up the current array index
  3733. add edx, eax
  3734. inc eax // increment it
  3735. mov usZIndex, ax // store incremented value
  3736. mov al, [edx] // get direction instruction
  3737. mov dx, usZLevel // get current z-level
  3738. or al, al
  3739. jz BlitNTL5 // dir = 0 no change
  3740. js BlitNTL4 // dir < 0 z-level down
  3741. // dir > 0 z-level up (default)
  3742. add dx, Z_STRIP_DELTA_Y
  3743. jmp BlitNTL5
  3744. BlitNTL4:
  3745. sub dx, Z_STRIP_DELTA_Y
  3746. BlitNTL5:
  3747. mov usZLevel, dx // store the now-modified z-level
  3748. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  3749. pop edx
  3750. BlitNTL6:
  3751. dec LSCount // decrement pixel length to blit
  3752. jz RightSkipLoop // done blitting the visible line
  3753. dec ecx
  3754. jnz BlitNTL1 // continue current run
  3755. jmp BlitDispatch // done current run, go for another
  3756. //----------------------------
  3757. // skipping transparent pixels
  3758. BlitTransparent: // skip transparent pixels
  3759. and ecx, 07fH
  3760. BlitTrans2:
  3761. add edi, 2 // move up the destination pointer
  3762. add ebx, 2
  3763. dec usZColsToGo
  3764. jnz BlitTrans1
  3765. // update the z-level according to the z-table
  3766. push edx
  3767. mov edx, pZArray // get pointer to array
  3768. xor eax, eax
  3769. mov ax, usZIndex // pick up the current array index
  3770. add edx, eax
  3771. inc eax // increment it
  3772. mov usZIndex, ax // store incremented value
  3773. mov al, [edx] // get direction instruction
  3774. mov dx, usZLevel // get current z-level
  3775. or al, al
  3776. jz BlitTrans5 // dir = 0 no change
  3777. js BlitTrans4 // dir < 0 z-level down
  3778. // dir > 0 z-level up (default)
  3779. add dx, Z_STRIP_DELTA_Y
  3780. jmp BlitTrans5
  3781. BlitTrans4:
  3782. sub dx, Z_STRIP_DELTA_Y
  3783. BlitTrans5:
  3784. mov usZLevel, dx // store the now-modified z-level
  3785. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  3786. pop edx
  3787. BlitTrans1:
  3788. dec LSCount // decrement the pixels to blit
  3789. jz RightSkipLoop // done the line
  3790. dec ecx
  3791. jnz BlitTrans2
  3792. jmp BlitDispatch
  3793. //---------------------------------------------
  3794. // Scans the ETRLE until it finds an EOL marker
  3795. RightSkipLoop:
  3796. RSLoop1:
  3797. mov al, [esi]
  3798. inc esi
  3799. or al, al
  3800. jnz RSLoop1
  3801. RSLoop2:
  3802. dec BlitHeight
  3803. jz BlitDone
  3804. add edi, LineSkip
  3805. add ebx, LineSkip
  3806. // reset all the z-level stuff for a new line
  3807. mov ax, usZStartLevel
  3808. mov usZLevel, ax
  3809. mov ax, usZStartIndex
  3810. mov usZIndex, ax
  3811. mov ax, usZStartCols
  3812. mov usZColsToGo, ax
  3813. jmp LeftSkipSetup
  3814. BlitDone:
  3815. }
  3816. return(TRUE);
  3817. }
  3818. /**********************************************************************************************
  3819. Blt8BPPDataTo16BPPBufferTransZIncClipSaveZBurnsThrough
  3820. Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
  3821. buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
  3822. pixel's Z level is below that of the current pixel, it is written on, and the Z value is
  3823. updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
  3824. must be the same dimensions (including Pitch) as the destination.
  3825. **********************************************************************************************/
  3826. BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncClipZSameZBurnsThrough( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
  3827. {
  3828. UINT16 *p16BPPPalette;
  3829. UINT32 uiOffset;
  3830. UINT32 usHeight, usWidth, Unblitted;
  3831. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  3832. UINT32 LineSkip;
  3833. ETRLEObject *pTrav;
  3834. INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
  3835. INT32 ClipX1, ClipY1, ClipX2, ClipY2;
  3836. UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
  3837. INT8 *pZArray;
  3838. ZStripInfo *pZInfo;
  3839. // Assertions
  3840. Assert( hSrcVObject != NULL );
  3841. Assert( pBuffer != NULL );
  3842. // Get Offsets from Index into structure
  3843. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  3844. usHeight = (UINT32)pTrav->usHeight;
  3845. usWidth = (UINT32)pTrav->usWidth;
  3846. uiOffset = pTrav->uiDataOffset;
  3847. // Add to start position of dest buffer
  3848. iTempX = iX + pTrav->sOffsetX;
  3849. iTempY = iY + pTrav->sOffsetY;
  3850. if(clipregion==NULL)
  3851. {
  3852. ClipX1=ClippingRect.iLeft;
  3853. ClipY1=ClippingRect.iTop;
  3854. ClipX2=ClippingRect.iRight;
  3855. ClipY2=ClippingRect.iBottom;
  3856. }
  3857. else
  3858. {
  3859. ClipX1=clipregion->iLeft;
  3860. ClipY1=clipregion->iTop;
  3861. ClipX2=clipregion->iRight;
  3862. ClipY2=clipregion->iBottom;
  3863. }
  3864. // Calculate rows hanging off each side of the screen
  3865. LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
  3866. RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
  3867. TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
  3868. BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
  3869. // calculate the remaining rows and columns to blit
  3870. BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
  3871. BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
  3872. // check if whole thing is clipped
  3873. if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
  3874. return(TRUE);
  3875. // check if whole thing is clipped
  3876. if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
  3877. return(TRUE);
  3878. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  3879. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  3880. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  3881. p16BPPPalette = hSrcVObject->pShadeCurrent;
  3882. LineSkip=(uiDestPitchBYTES-(BlitLength*2));
  3883. if(hSrcVObject->ppZStripInfo==NULL)
  3884. {
  3885. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  3886. return(FALSE);
  3887. }
  3888. // setup for the z-column blitting stuff
  3889. pZInfo=hSrcVObject->ppZStripInfo[usIndex];
  3890. if(pZInfo==NULL)
  3891. {
  3892. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  3893. return(FALSE);
  3894. }
  3895. usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
  3896. // set to odd number of pixels for first column
  3897. if(LeftSkip > pZInfo->ubFirstZStripWidth)
  3898. {
  3899. usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
  3900. usZStartCols=20-(usZStartCols%20);
  3901. }
  3902. else if(LeftSkip < pZInfo->ubFirstZStripWidth)
  3903. usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
  3904. else
  3905. usZStartCols=20;
  3906. usZColsToGo=usZStartCols;
  3907. pZArray=pZInfo->pbZChange;
  3908. if(LeftSkip >= pZInfo->ubFirstZStripWidth)
  3909. {
  3910. // Index into array after doing left clipping
  3911. usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
  3912. //calculates the Z-value after left-side clipping
  3913. if(usZStartIndex)
  3914. {
  3915. for(usCount=0; usCount < usZStartIndex; usCount++)
  3916. {
  3917. switch(pZArray[usCount])
  3918. {
  3919. case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
  3920. break;
  3921. case 0: //no change
  3922. break;
  3923. case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
  3924. break;
  3925. }
  3926. }
  3927. }
  3928. }
  3929. else
  3930. usZStartIndex=0;
  3931. usZLevel=usZStartLevel;
  3932. usZIndex=usZStartIndex;
  3933. __asm {
  3934. mov esi, SrcPtr
  3935. mov edi, DestPtr
  3936. mov edx, p16BPPPalette
  3937. xor eax, eax
  3938. mov ebx, ZPtr
  3939. xor ecx, ecx
  3940. cmp TopSkip, 0 // check for nothing clipped on top
  3941. je LeftSkipSetup
  3942. // Skips the number of lines clipped at the top
  3943. TopSkipLoop:
  3944. mov cl, [esi]
  3945. inc esi
  3946. or cl, cl
  3947. js TopSkipLoop
  3948. jz TSEndLine
  3949. add esi, ecx
  3950. jmp TopSkipLoop
  3951. TSEndLine:
  3952. dec TopSkip
  3953. jnz TopSkipLoop
  3954. // Start of line loop
  3955. // Skips the pixels hanging outside the left-side boundry
  3956. LeftSkipSetup:
  3957. mov Unblitted, 0 // Unblitted counts any pixels left from a run
  3958. mov eax, LeftSkip // after we have skipped enough left-side pixels
  3959. mov LSCount, eax // LSCount counts how many pixels skipped so far
  3960. or eax, eax
  3961. jz BlitLineSetup // check for nothing to skip
  3962. LeftSkipLoop:
  3963. mov cl, [esi]
  3964. inc esi
  3965. or cl, cl
  3966. js LSTrans
  3967. cmp ecx, LSCount
  3968. je LSSkip2 // if equal, skip whole, and start blit with new run
  3969. jb LSSkip1 // if less, skip whole thing
  3970. add esi, LSCount // skip partial run, jump into normal loop for rest
  3971. sub ecx, LSCount
  3972. mov eax, BlitLength
  3973. mov LSCount, eax
  3974. mov Unblitted, 0
  3975. jmp BlitNTL1 // *** jumps into non-transparent blit loop
  3976. LSSkip2:
  3977. add esi, ecx // skip whole run, and start blit with new run
  3978. jmp BlitLineSetup
  3979. LSSkip1:
  3980. add esi, ecx // skip whole run, continue skipping
  3981. sub LSCount, ecx
  3982. jmp LeftSkipLoop
  3983. LSTrans:
  3984. and ecx, 07fH
  3985. cmp ecx, LSCount
  3986. je BlitLineSetup // if equal, skip whole, and start blit with new run
  3987. jb LSTrans1 // if less, skip whole thing
  3988. sub ecx, LSCount // skip partial run, jump into normal loop for rest
  3989. mov eax, BlitLength
  3990. mov LSCount, eax
  3991. mov Unblitted, 0
  3992. jmp BlitTransparent // *** jumps into transparent blit loop
  3993. LSTrans1:
  3994. sub LSCount, ecx // skip whole run, continue skipping
  3995. jmp LeftSkipLoop
  3996. //-------------------------------------------------
  3997. // setup for beginning of line
  3998. BlitLineSetup:
  3999. mov eax, BlitLength
  4000. mov LSCount, eax
  4001. mov Unblitted, 0
  4002. BlitDispatch:
  4003. cmp LSCount, 0 // Check to see if we're done blitting
  4004. je RightSkipLoop
  4005. mov cl, [esi]
  4006. inc esi
  4007. or cl, cl
  4008. js BlitTransparent
  4009. jz RSLoop2
  4010. //--------------------------------
  4011. // blitting non-transparent pixels
  4012. and ecx, 07fH
  4013. BlitNTL1:
  4014. mov ax, [ebx] // check z-level of pixel
  4015. cmp ax, usZLevel
  4016. ja BlitNTL2
  4017. mov ax, usZLevel // update z-level of pixel
  4018. mov [ebx], ax
  4019. xor eax, eax
  4020. mov al, [esi] // copy pixel
  4021. mov ax, [edx+eax*2]
  4022. mov [edi], ax
  4023. BlitNTL2:
  4024. inc esi
  4025. add edi, 2
  4026. add ebx, 2
  4027. dec usZColsToGo
  4028. jnz BlitNTL6
  4029. // update the z-level according to the z-table
  4030. push edx
  4031. mov edx, pZArray // get pointer to array
  4032. xor eax, eax
  4033. mov ax, usZIndex // pick up the current array index
  4034. add edx, eax
  4035. inc eax // increment it
  4036. mov usZIndex, ax // store incremented value
  4037. mov al, [edx] // get direction instruction
  4038. mov dx, usZLevel // get current z-level
  4039. or al, al
  4040. jz BlitNTL5 // dir = 0 no change
  4041. js BlitNTL4 // dir < 0 z-level down
  4042. // dir > 0 z-level up (default)
  4043. add dx, Z_STRIP_DELTA_Y
  4044. jmp BlitNTL5
  4045. BlitNTL4:
  4046. sub dx, Z_STRIP_DELTA_Y
  4047. BlitNTL5:
  4048. mov usZLevel, dx // store the now-modified z-level
  4049. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4050. pop edx
  4051. BlitNTL6:
  4052. dec LSCount // decrement pixel length to blit
  4053. jz RightSkipLoop // done blitting the visible line
  4054. dec ecx
  4055. jnz BlitNTL1 // continue current run
  4056. jmp BlitDispatch // done current run, go for another
  4057. //----------------------------
  4058. // skipping transparent pixels
  4059. BlitTransparent: // skip transparent pixels
  4060. and ecx, 07fH
  4061. BlitTrans2:
  4062. add edi, 2 // move up the destination pointer
  4063. add ebx, 2
  4064. dec usZColsToGo
  4065. jnz BlitTrans1
  4066. // update the z-level according to the z-table
  4067. push edx
  4068. mov edx, pZArray // get pointer to array
  4069. xor eax, eax
  4070. mov ax, usZIndex // pick up the current array index
  4071. add edx, eax
  4072. inc eax // increment it
  4073. mov usZIndex, ax // store incremented value
  4074. mov al, [edx] // get direction instruction
  4075. mov dx, usZLevel // get current z-level
  4076. or al, al
  4077. jz BlitTrans5 // dir = 0 no change
  4078. js BlitTrans4 // dir < 0 z-level down
  4079. // dir > 0 z-level up (default)
  4080. add dx, Z_STRIP_DELTA_Y
  4081. jmp BlitTrans5
  4082. BlitTrans4:
  4083. sub dx, Z_STRIP_DELTA_Y
  4084. BlitTrans5:
  4085. mov usZLevel, dx // store the now-modified z-level
  4086. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4087. pop edx
  4088. BlitTrans1:
  4089. dec LSCount // decrement the pixels to blit
  4090. jz RightSkipLoop // done the line
  4091. dec ecx
  4092. jnz BlitTrans2
  4093. jmp BlitDispatch
  4094. //---------------------------------------------
  4095. // Scans the ETRLE until it finds an EOL marker
  4096. RightSkipLoop:
  4097. RSLoop1:
  4098. mov al, [esi]
  4099. inc esi
  4100. or al, al
  4101. jnz RSLoop1
  4102. RSLoop2:
  4103. dec BlitHeight
  4104. jz BlitDone
  4105. add edi, LineSkip
  4106. add ebx, LineSkip
  4107. // reset all the z-level stuff for a new line
  4108. mov ax, usZStartLevel
  4109. mov usZLevel, ax
  4110. mov ax, usZStartIndex
  4111. mov usZIndex, ax
  4112. mov ax, usZStartCols
  4113. mov usZColsToGo, ax
  4114. jmp LeftSkipSetup
  4115. BlitDone:
  4116. }
  4117. return(TRUE);
  4118. }
  4119. /**********************************************************************************************
  4120. Blt8BPPDataTo16BPPBufferTransZIncObscureClip
  4121. Blits an image into the destination buffer, using an ETRLE brush as a source, and a 16-bit
  4122. buffer as a destination. As it is blitting, it checks the Z value of the ZBuffer, and if the
  4123. pixel's Z level is below that of the current pixel, it is written on, and the Z value is
  4124. updated to the current value, for any non-transparent pixels. The Z-buffer is 16 bit, and
  4125. must be the same dimensions (including Pitch) as the destination.
  4126. //ATE: This blitter makes the values that are =< z value pixellate rather than not
  4127. // render at all
  4128. **********************************************************************************************/
  4129. BOOLEAN Blt8BPPDataTo16BPPBufferTransZIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion)
  4130. {
  4131. UINT16 *p16BPPPalette;
  4132. UINT32 uiOffset, uiLineFlag;
  4133. UINT32 usHeight, usWidth, Unblitted;
  4134. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  4135. UINT32 LineSkip;
  4136. ETRLEObject *pTrav;
  4137. INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
  4138. INT32 ClipX1, ClipY1, ClipX2, ClipY2;
  4139. UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
  4140. INT8 *pZArray;
  4141. ZStripInfo *pZInfo;
  4142. // Assertions
  4143. Assert( hSrcVObject != NULL );
  4144. Assert( pBuffer != NULL );
  4145. // Get Offsets from Index into structure
  4146. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  4147. usHeight = (UINT32)pTrav->usHeight;
  4148. usWidth = (UINT32)pTrav->usWidth;
  4149. uiOffset = pTrav->uiDataOffset;
  4150. // Add to start position of dest buffer
  4151. iTempX = iX + pTrav->sOffsetX;
  4152. iTempY = iY + pTrav->sOffsetY;
  4153. if(clipregion==NULL)
  4154. {
  4155. ClipX1=ClippingRect.iLeft;
  4156. ClipY1=ClippingRect.iTop;
  4157. ClipX2=ClippingRect.iRight;
  4158. ClipY2=ClippingRect.iBottom;
  4159. }
  4160. else
  4161. {
  4162. ClipX1=clipregion->iLeft;
  4163. ClipY1=clipregion->iTop;
  4164. ClipX2=clipregion->iRight;
  4165. ClipY2=clipregion->iBottom;
  4166. }
  4167. // Calculate rows hanging off each side of the screen
  4168. LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
  4169. RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
  4170. TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
  4171. BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
  4172. uiLineFlag=(iTempY&1);
  4173. // calculate the remaining rows and columns to blit
  4174. BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
  4175. BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
  4176. // check if whole thing is clipped
  4177. if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
  4178. return(TRUE);
  4179. // check if whole thing is clipped
  4180. if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
  4181. return(TRUE);
  4182. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  4183. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4184. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4185. p16BPPPalette = hSrcVObject->pShadeCurrent;
  4186. LineSkip=(uiDestPitchBYTES-(BlitLength*2));
  4187. if(hSrcVObject->ppZStripInfo==NULL)
  4188. {
  4189. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4190. return(FALSE);
  4191. }
  4192. // setup for the z-column blitting stuff
  4193. pZInfo=hSrcVObject->ppZStripInfo[usIndex];
  4194. if(pZInfo==NULL)
  4195. {
  4196. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4197. return(FALSE);
  4198. }
  4199. usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_STRIP_DELTA_Y));
  4200. // set to odd number of pixels for first column
  4201. if(LeftSkip > pZInfo->ubFirstZStripWidth)
  4202. {
  4203. usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
  4204. usZStartCols=20-(usZStartCols%20);
  4205. }
  4206. else if(LeftSkip < pZInfo->ubFirstZStripWidth)
  4207. usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
  4208. else
  4209. usZStartCols=20;
  4210. usZColsToGo=usZStartCols;
  4211. pZArray=pZInfo->pbZChange;
  4212. if(LeftSkip >= pZInfo->ubFirstZStripWidth)
  4213. {
  4214. // Index into array after doing left clipping
  4215. usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
  4216. //calculates the Z-value after left-side clipping
  4217. if(usZStartIndex)
  4218. {
  4219. for(usCount=0; usCount < usZStartIndex; usCount++)
  4220. {
  4221. switch(pZArray[usCount])
  4222. {
  4223. case -1: usZStartLevel-=Z_STRIP_DELTA_Y;
  4224. break;
  4225. case 0: //no change
  4226. break;
  4227. case 1: usZStartLevel+=Z_STRIP_DELTA_Y;
  4228. break;
  4229. }
  4230. }
  4231. }
  4232. }
  4233. else
  4234. usZStartIndex=0;
  4235. usZLevel=usZStartLevel;
  4236. usZIndex=usZStartIndex;
  4237. __asm {
  4238. mov esi, SrcPtr
  4239. mov edi, DestPtr
  4240. mov edx, p16BPPPalette
  4241. xor eax, eax
  4242. mov ebx, ZPtr
  4243. xor ecx, ecx
  4244. cmp TopSkip, 0 // check for nothing clipped on top
  4245. je LeftSkipSetup
  4246. // Skips the number of lines clipped at the top
  4247. TopSkipLoop:
  4248. mov cl, [esi]
  4249. inc esi
  4250. or cl, cl
  4251. js TopSkipLoop
  4252. jz TSEndLine
  4253. add esi, ecx
  4254. jmp TopSkipLoop
  4255. TSEndLine:
  4256. xor uiLineFlag, 1
  4257. dec TopSkip
  4258. jnz TopSkipLoop
  4259. // Start of line loop
  4260. // Skips the pixels hanging outside the left-side boundry
  4261. LeftSkipSetup:
  4262. mov Unblitted, 0 // Unblitted counts any pixels left from a run
  4263. mov eax, LeftSkip // after we have skipped enough left-side pixels
  4264. mov LSCount, eax // LSCount counts how many pixels skipped so far
  4265. or eax, eax
  4266. jz BlitLineSetup // check for nothing to skip
  4267. LeftSkipLoop:
  4268. mov cl, [esi]
  4269. inc esi
  4270. or cl, cl
  4271. js LSTrans
  4272. cmp ecx, LSCount
  4273. je LSSkip2 // if equal, skip whole, and start blit with new run
  4274. jb LSSkip1 // if less, skip whole thing
  4275. add esi, LSCount // skip partial run, jump into normal loop for rest
  4276. sub ecx, LSCount
  4277. mov eax, BlitLength
  4278. mov LSCount, eax
  4279. mov Unblitted, 0
  4280. jmp BlitNTL1 // *** jumps into non-transparent blit loop
  4281. LSSkip2:
  4282. add esi, ecx // skip whole run, and start blit with new run
  4283. jmp BlitLineSetup
  4284. LSSkip1:
  4285. add esi, ecx // skip whole run, continue skipping
  4286. sub LSCount, ecx
  4287. jmp LeftSkipLoop
  4288. LSTrans:
  4289. and ecx, 07fH
  4290. cmp ecx, LSCount
  4291. je BlitLineSetup // if equal, skip whole, and start blit with new run
  4292. jb LSTrans1 // if less, skip whole thing
  4293. sub ecx, LSCount // skip partial run, jump into normal loop for rest
  4294. mov eax, BlitLength
  4295. mov LSCount, eax
  4296. mov Unblitted, 0
  4297. jmp BlitTransparent // *** jumps into transparent blit loop
  4298. LSTrans1:
  4299. sub LSCount, ecx // skip whole run, continue skipping
  4300. jmp LeftSkipLoop
  4301. //-------------------------------------------------
  4302. // setup for beginning of line
  4303. BlitLineSetup:
  4304. mov eax, BlitLength
  4305. mov LSCount, eax
  4306. mov Unblitted, 0
  4307. BlitDispatch:
  4308. cmp LSCount, 0 // Check to see if we're done blitting
  4309. je RightSkipLoop
  4310. mov cl, [esi]
  4311. inc esi
  4312. or cl, cl
  4313. js BlitTransparent
  4314. jz RSLoop2
  4315. //--------------------------------
  4316. // blitting non-transparent pixels
  4317. and ecx, 07fH
  4318. BlitNTL1:
  4319. mov ax, [ebx] // check z-level of pixel
  4320. cmp ax, usZLevel
  4321. jae BlitPixellate1
  4322. jmp BlitPixel1
  4323. BlitPixellate1:
  4324. // OK, DO PIXELLATE SCHEME HERE!
  4325. test uiLineFlag, 1
  4326. jz BlitSkip1
  4327. test edi, 2
  4328. jz BlitNTL2
  4329. jmp BlitPixel1
  4330. BlitSkip1:
  4331. test edi, 2
  4332. jnz BlitNTL2
  4333. BlitPixel1:
  4334. mov ax, usZLevel // update z-level of pixel
  4335. mov [ebx], ax
  4336. xor eax, eax
  4337. mov al, [esi] // copy pixel
  4338. mov ax, [edx+eax*2]
  4339. mov [edi], ax
  4340. BlitNTL2:
  4341. inc esi
  4342. add edi, 2
  4343. add ebx, 2
  4344. dec usZColsToGo
  4345. jnz BlitNTL6
  4346. // update the z-level according to the z-table
  4347. push edx
  4348. mov edx, pZArray // get pointer to array
  4349. xor eax, eax
  4350. mov ax, usZIndex // pick up the current array index
  4351. add edx, eax
  4352. inc eax // increment it
  4353. mov usZIndex, ax // store incremented value
  4354. mov al, [edx] // get direction instruction
  4355. mov dx, usZLevel // get current z-level
  4356. or al, al
  4357. jz BlitNTL5 // dir = 0 no change
  4358. js BlitNTL4 // dir < 0 z-level down
  4359. // dir > 0 z-level up (default)
  4360. add dx, Z_STRIP_DELTA_Y
  4361. jmp BlitNTL5
  4362. BlitNTL4:
  4363. sub dx, Z_STRIP_DELTA_Y
  4364. BlitNTL5:
  4365. mov usZLevel, dx // store the now-modified z-level
  4366. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4367. pop edx
  4368. BlitNTL6:
  4369. dec LSCount // decrement pixel length to blit
  4370. jz RightSkipLoop // done blitting the visible line
  4371. dec ecx
  4372. jnz BlitNTL1 // continue current run
  4373. jmp BlitDispatch // done current run, go for another
  4374. //----------------------------
  4375. // skipping transparent pixels
  4376. BlitTransparent: // skip transparent pixels
  4377. and ecx, 07fH
  4378. BlitTrans2:
  4379. add edi, 2 // move up the destination pointer
  4380. add ebx, 2
  4381. dec usZColsToGo
  4382. jnz BlitTrans1
  4383. // update the z-level according to the z-table
  4384. push edx
  4385. mov edx, pZArray // get pointer to array
  4386. xor eax, eax
  4387. mov ax, usZIndex // pick up the current array index
  4388. add edx, eax
  4389. inc eax // increment it
  4390. mov usZIndex, ax // store incremented value
  4391. mov al, [edx] // get direction instruction
  4392. mov dx, usZLevel // get current z-level
  4393. or al, al
  4394. jz BlitTrans5 // dir = 0 no change
  4395. js BlitTrans4 // dir < 0 z-level down
  4396. // dir > 0 z-level up (default)
  4397. add dx, Z_STRIP_DELTA_Y
  4398. jmp BlitTrans5
  4399. BlitTrans4:
  4400. sub dx, Z_STRIP_DELTA_Y
  4401. BlitTrans5:
  4402. mov usZLevel, dx // store the now-modified z-level
  4403. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4404. pop edx
  4405. BlitTrans1:
  4406. dec LSCount // decrement the pixels to blit
  4407. jz RightSkipLoop // done the line
  4408. dec ecx
  4409. jnz BlitTrans2
  4410. jmp BlitDispatch
  4411. //---------------------------------------------
  4412. // Scans the ETRLE until it finds an EOL marker
  4413. RightSkipLoop:
  4414. RSLoop1:
  4415. mov al, [esi]
  4416. inc esi
  4417. or al, al
  4418. jnz RSLoop1
  4419. RSLoop2:
  4420. xor uiLineFlag, 1
  4421. dec BlitHeight
  4422. jz BlitDone
  4423. add edi, LineSkip
  4424. add ebx, LineSkip
  4425. // reset all the z-level stuff for a new line
  4426. mov ax, usZStartLevel
  4427. mov usZLevel, ax
  4428. mov ax, usZStartIndex
  4429. mov usZIndex, ax
  4430. mov ax, usZStartCols
  4431. mov usZColsToGo, ax
  4432. jmp LeftSkipSetup
  4433. BlitDone:
  4434. }
  4435. return(TRUE);
  4436. }
  4437. // Blitter Specs
  4438. // 1 ) 8 to 16 bpp
  4439. // 2 ) strip z-blitter
  4440. // 3 ) clipped
  4441. // 4 ) trans shadow - if value is 254, makes a shadow
  4442. //
  4443. BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncObscureClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette )
  4444. {
  4445. UINT32 uiOffset, uiLineFlag;
  4446. UINT32 usHeight, usWidth, Unblitted;
  4447. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  4448. UINT32 LineSkip;
  4449. ETRLEObject *pTrav;
  4450. INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
  4451. INT32 ClipX1, ClipY1, ClipX2, ClipY2;
  4452. UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
  4453. INT8 *pZArray;
  4454. ZStripInfo *pZInfo;
  4455. // Assertions
  4456. Assert( hSrcVObject != NULL );
  4457. Assert( pBuffer != NULL );
  4458. // Get Offsets from Index into structure
  4459. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  4460. usHeight = (UINT32)pTrav->usHeight;
  4461. usWidth = (UINT32)pTrav->usWidth;
  4462. uiOffset = pTrav->uiDataOffset;
  4463. // Add to start position of dest buffer
  4464. iTempX = iX + pTrav->sOffsetX;
  4465. iTempY = iY + pTrav->sOffsetY;
  4466. if(clipregion==NULL)
  4467. {
  4468. ClipX1=ClippingRect.iLeft;
  4469. ClipY1=ClippingRect.iTop;
  4470. ClipX2=ClippingRect.iRight;
  4471. ClipY2=ClippingRect.iBottom;
  4472. }
  4473. else
  4474. {
  4475. ClipX1=clipregion->iLeft;
  4476. ClipY1=clipregion->iTop;
  4477. ClipX2=clipregion->iRight;
  4478. ClipY2=clipregion->iBottom;
  4479. }
  4480. // Calculate rows hanging off each side of the screen
  4481. LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
  4482. RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
  4483. TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
  4484. BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
  4485. uiLineFlag=(iTempY&1);
  4486. // calculate the remaining rows and columns to blit
  4487. BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
  4488. BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
  4489. // check if whole thing is clipped
  4490. if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
  4491. return(TRUE);
  4492. // check if whole thing is clipped
  4493. if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
  4494. return(TRUE);
  4495. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  4496. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4497. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4498. LineSkip=(uiDestPitchBYTES-(BlitLength*2));
  4499. if(hSrcVObject->ppZStripInfo==NULL)
  4500. {
  4501. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4502. return(FALSE);
  4503. }
  4504. // setup for the z-column blitting stuff
  4505. pZInfo=hSrcVObject->ppZStripInfo[sZIndex];
  4506. if(pZInfo==NULL)
  4507. {
  4508. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4509. return(FALSE);
  4510. }
  4511. usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_SUBLAYERS*10));
  4512. if(LeftSkip > pZInfo->ubFirstZStripWidth)
  4513. {
  4514. usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
  4515. usZStartCols=20-(usZStartCols%20);
  4516. }
  4517. else if(LeftSkip < pZInfo->ubFirstZStripWidth)
  4518. usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
  4519. else
  4520. usZStartCols=20;
  4521. // set to odd number of pixels for first column
  4522. usZColsToGo=usZStartCols;
  4523. pZArray=pZInfo->pbZChange;
  4524. if(LeftSkip >= usZColsToGo)
  4525. {
  4526. // Index into array after doing left clipping
  4527. usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
  4528. //calculates the Z-value after left-side clipping
  4529. if(usZStartIndex)
  4530. {
  4531. for(usCount=0; usCount < usZStartIndex; usCount++)
  4532. {
  4533. switch(pZArray[usCount])
  4534. {
  4535. case -1: usZStartLevel-=Z_SUBLAYERS;
  4536. break;
  4537. case 0: //no change
  4538. break;
  4539. case 1: usZStartLevel+=Z_SUBLAYERS;
  4540. break;
  4541. }
  4542. }
  4543. }
  4544. }
  4545. else
  4546. usZStartIndex=0;
  4547. usZLevel=usZStartLevel;
  4548. usZIndex=usZStartIndex;
  4549. __asm {
  4550. mov esi, SrcPtr
  4551. mov edi, DestPtr
  4552. mov edx, p16BPPPalette
  4553. xor eax, eax
  4554. mov ebx, ZPtr
  4555. xor ecx, ecx
  4556. cmp TopSkip, 0 // check for nothing clipped on top
  4557. je LeftSkipSetup
  4558. // Skips the number of lines clipped at the top
  4559. TopSkipLoop:
  4560. mov cl, [esi]
  4561. inc esi
  4562. or cl, cl
  4563. js TopSkipLoop
  4564. jz TSEndLine
  4565. add esi, ecx
  4566. jmp TopSkipLoop
  4567. TSEndLine:
  4568. xor uiLineFlag, 1
  4569. dec TopSkip
  4570. jnz TopSkipLoop
  4571. // Start of line loop
  4572. // Skips the pixels hanging outside the left-side boundry
  4573. LeftSkipSetup:
  4574. mov Unblitted, 0 // Unblitted counts any pixels left from a run
  4575. mov eax, LeftSkip // after we have skipped enough left-side pixels
  4576. mov LSCount, eax // LSCount counts how many pixels skipped so far
  4577. or eax, eax
  4578. jz BlitLineSetup // check for nothing to skip
  4579. LeftSkipLoop:
  4580. mov cl, [esi]
  4581. inc esi
  4582. or cl, cl
  4583. js LSTrans
  4584. cmp ecx, LSCount
  4585. je LSSkip2 // if equal, skip whole, and start blit with new run
  4586. jb LSSkip1 // if less, skip whole thing
  4587. add esi, LSCount // skip partial run, jump into normal loop for rest
  4588. sub ecx, LSCount
  4589. mov eax, BlitLength
  4590. mov LSCount, eax
  4591. mov Unblitted, 0
  4592. jmp BlitNTL1 // *** jumps into non-transparent blit loop
  4593. LSSkip2:
  4594. add esi, ecx // skip whole run, and start blit with new run
  4595. jmp BlitLineSetup
  4596. LSSkip1:
  4597. add esi, ecx // skip whole run, continue skipping
  4598. sub LSCount, ecx
  4599. jmp LeftSkipLoop
  4600. LSTrans:
  4601. and ecx, 07fH
  4602. cmp ecx, LSCount
  4603. je BlitLineSetup // if equal, skip whole, and start blit with new run
  4604. jb LSTrans1 // if less, skip whole thing
  4605. sub ecx, LSCount // skip partial run, jump into normal loop for rest
  4606. mov eax, BlitLength
  4607. mov LSCount, eax
  4608. mov Unblitted, 0
  4609. jmp BlitTransparent // *** jumps into transparent blit loop
  4610. LSTrans1:
  4611. sub LSCount, ecx // skip whole run, continue skipping
  4612. jmp LeftSkipLoop
  4613. //-------------------------------------------------
  4614. // setup for beginning of line
  4615. BlitLineSetup:
  4616. mov eax, BlitLength
  4617. mov LSCount, eax
  4618. mov Unblitted, 0
  4619. BlitDispatch:
  4620. cmp LSCount, 0 // Check to see if we're done blitting
  4621. je RightSkipLoop
  4622. mov cl, [esi]
  4623. inc esi
  4624. or cl, cl
  4625. js BlitTransparent
  4626. jz RSLoop2
  4627. //--------------------------------
  4628. // blitting non-transparent pixels
  4629. and ecx, 07fH
  4630. BlitNTL1:
  4631. mov ax, [ebx] // check z-level of pixel
  4632. cmp ax, usZLevel
  4633. jae BlitPixellate1
  4634. jmp BlitPixel1
  4635. BlitPixellate1:
  4636. // OK, DO PIXELLATE SCHEME HERE!
  4637. test uiLineFlag, 1
  4638. jz BlitSkip1
  4639. test edi, 2
  4640. jz BlitNTL2
  4641. jmp BlitPixel1
  4642. BlitSkip1:
  4643. test edi, 2
  4644. jnz BlitNTL2
  4645. BlitPixel1:
  4646. mov ax, usZLevel // update z-level of pixel
  4647. mov [ebx], ax
  4648. // Check for shadow...
  4649. xor eax, eax
  4650. mov al, [esi]
  4651. cmp al, 254
  4652. jne BlitNTL66
  4653. mov ax, [edi]
  4654. mov ax, ShadeTable[eax*2]
  4655. mov [edi], ax
  4656. jmp BlitNTL2
  4657. BlitNTL66:
  4658. mov ax, [edx+eax*2] // Copy pixel
  4659. mov [edi], ax
  4660. BlitNTL2:
  4661. inc esi
  4662. add edi, 2
  4663. add ebx, 2
  4664. dec usZColsToGo
  4665. jnz BlitNTL6
  4666. // update the z-level according to the z-table
  4667. push edx
  4668. mov edx, pZArray // get pointer to array
  4669. xor eax, eax
  4670. mov ax, usZIndex // pick up the current array index
  4671. add edx, eax
  4672. inc eax // increment it
  4673. mov usZIndex, ax // store incremented value
  4674. mov al, [edx] // get direction instruction
  4675. mov dx, usZLevel // get current z-level
  4676. or al, al
  4677. jz BlitNTL5 // dir = 0 no change
  4678. js BlitNTL4 // dir < 0 z-level down
  4679. // dir > 0 z-level up (default)
  4680. add dx, Z_SUBLAYERS
  4681. jmp BlitNTL5
  4682. BlitNTL4:
  4683. sub dx, Z_SUBLAYERS
  4684. BlitNTL5:
  4685. mov usZLevel, dx // store the now-modified z-level
  4686. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4687. pop edx
  4688. BlitNTL6:
  4689. dec LSCount // decrement pixel length to blit
  4690. jz RightSkipLoop // done blitting the visible line
  4691. dec ecx
  4692. jnz BlitNTL1 // continue current run
  4693. jmp BlitDispatch // done current run, go for another
  4694. //----------------------------
  4695. // skipping transparent pixels
  4696. BlitTransparent: // skip transparent pixels
  4697. and ecx, 07fH
  4698. BlitTrans2:
  4699. add edi, 2 // move up the destination pointer
  4700. add ebx, 2
  4701. dec usZColsToGo
  4702. jnz BlitTrans1
  4703. // update the z-level according to the z-table
  4704. push edx
  4705. mov edx, pZArray // get pointer to array
  4706. xor eax, eax
  4707. mov ax, usZIndex // pick up the current array index
  4708. add edx, eax
  4709. inc eax // increment it
  4710. mov usZIndex, ax // store incremented value
  4711. mov al, [edx] // get direction instruction
  4712. mov dx, usZLevel // get current z-level
  4713. or al, al
  4714. jz BlitTrans5 // dir = 0 no change
  4715. js BlitTrans4 // dir < 0 z-level down
  4716. // dir > 0 z-level up (default)
  4717. add dx, Z_SUBLAYERS
  4718. jmp BlitTrans5
  4719. BlitTrans4:
  4720. sub dx, Z_SUBLAYERS
  4721. BlitTrans5:
  4722. mov usZLevel, dx // store the now-modified z-level
  4723. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  4724. pop edx
  4725. BlitTrans1:
  4726. dec LSCount // decrement the pixels to blit
  4727. jz RightSkipLoop // done the line
  4728. dec ecx
  4729. jnz BlitTrans2
  4730. jmp BlitDispatch
  4731. //---------------------------------------------
  4732. // Scans the ETRLE until it finds an EOL marker
  4733. RightSkipLoop:
  4734. RSLoop1:
  4735. mov al, [esi]
  4736. inc esi
  4737. or al, al
  4738. jnz RSLoop1
  4739. RSLoop2:
  4740. xor uiLineFlag, 1
  4741. dec BlitHeight
  4742. jz BlitDone
  4743. add edi, LineSkip
  4744. add ebx, LineSkip
  4745. // reset all the z-level stuff for a new line
  4746. mov ax, usZStartLevel
  4747. mov usZLevel, ax
  4748. mov ax, usZStartIndex
  4749. mov usZIndex, ax
  4750. mov ax, usZStartCols
  4751. mov usZColsToGo, ax
  4752. jmp LeftSkipSetup
  4753. BlitDone:
  4754. }
  4755. return(TRUE);
  4756. }
  4757. void CorrectRenderCenter( INT16 sRenderX, INT16 sRenderY, INT16 *pSNewX, INT16 *pSNewY )
  4758. {
  4759. INT16 sScreenX, sScreenY;
  4760. INT16 sNumXSteps, sNumYSteps;
  4761. // Use radar scale values to get screen values, then convert ot map values, rounding to nearest middle tile
  4762. sScreenX = (INT16) sRenderX;
  4763. sScreenY = (INT16) sRenderY;
  4764. // Adjust for offsets!
  4765. sScreenX += 0;
  4766. sScreenY += 10;
  4767. // Adjust to viewport start!
  4768. sScreenX -= ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 );
  4769. sScreenY -= ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 );
  4770. //Make sure these coordinates are multiples of scroll steps
  4771. sNumXSteps = sScreenX / gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
  4772. sNumYSteps = sScreenY / gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ];
  4773. sScreenX = ( sNumXSteps * gubNewScrollXSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ] );
  4774. sScreenY = ( sNumYSteps * gubNewScrollYSpeeds[ gfDoVideoScroll ][ gubCurScrollSpeedID ]);
  4775. // Adjust back
  4776. sScreenX += ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 );
  4777. sScreenY += ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 );
  4778. *pSNewX = sScreenX;
  4779. *pSNewY = sScreenY;
  4780. }
  4781. // Blitter Specs
  4782. // 1 ) 8 to 16 bpp
  4783. // 2 ) strip z-blitter
  4784. // 3 ) clipped
  4785. // 4 ) trans shadow - if value is 254, makes a shadow
  4786. //
  4787. BOOLEAN Blt8BPPDataTo16BPPBufferTransZTransShadowIncClip( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex, SGPRect *clipregion, INT16 sZIndex, UINT16 *p16BPPPalette )
  4788. {
  4789. UINT32 uiOffset;
  4790. UINT32 usHeight, usWidth, Unblitted;
  4791. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  4792. UINT32 LineSkip;
  4793. ETRLEObject *pTrav;
  4794. INT32 iTempX, iTempY, LeftSkip, RightSkip, TopSkip, BottomSkip, BlitLength, BlitHeight, LSCount;
  4795. INT32 ClipX1, ClipY1, ClipX2, ClipY2;
  4796. UINT16 usZLevel, usZStartLevel, usZColsToGo, usZStartIndex, usCount, usZIndex, usZStartCols;
  4797. INT8 *pZArray;
  4798. ZStripInfo *pZInfo;
  4799. // Assertions
  4800. Assert( hSrcVObject != NULL );
  4801. Assert( pBuffer != NULL );
  4802. // Get Offsets from Index into structure
  4803. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  4804. usHeight = (UINT32)pTrav->usHeight;
  4805. usWidth = (UINT32)pTrav->usWidth;
  4806. uiOffset = pTrav->uiDataOffset;
  4807. // Add to start position of dest buffer
  4808. iTempX = iX + pTrav->sOffsetX;
  4809. iTempY = iY + pTrav->sOffsetY;
  4810. if(clipregion==NULL)
  4811. {
  4812. ClipX1=ClippingRect.iLeft;
  4813. ClipY1=ClippingRect.iTop;
  4814. ClipX2=ClippingRect.iRight;
  4815. ClipY2=ClippingRect.iBottom;
  4816. }
  4817. else
  4818. {
  4819. ClipX1=clipregion->iLeft;
  4820. ClipY1=clipregion->iTop;
  4821. ClipX2=clipregion->iRight;
  4822. ClipY2=clipregion->iBottom;
  4823. }
  4824. // Calculate rows hanging off each side of the screen
  4825. LeftSkip=__min(ClipX1 - min(ClipX1, iTempX), (INT32)usWidth);
  4826. RightSkip=__min(max(ClipX2, (iTempX+(INT32)usWidth)) - ClipX2, (INT32)usWidth);
  4827. TopSkip=__min(ClipY1 - __min(ClipY1, iTempY), (INT32)usHeight);
  4828. BottomSkip=__min(__max(ClipY2, (iTempY+(INT32)usHeight)) - ClipY2, (INT32)usHeight);
  4829. // calculate the remaining rows and columns to blit
  4830. BlitLength=((INT32)usWidth-LeftSkip-RightSkip);
  4831. BlitHeight=((INT32)usHeight-TopSkip-BottomSkip);
  4832. // check if whole thing is clipped
  4833. if((LeftSkip >=(INT32)usWidth) || (RightSkip >=(INT32)usWidth))
  4834. return(TRUE);
  4835. // check if whole thing is clipped
  4836. if((TopSkip >=(INT32)usHeight) || (BottomSkip >=(INT32)usHeight))
  4837. return(TRUE);
  4838. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  4839. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4840. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*(iTempY+TopSkip)) + ((iTempX+LeftSkip)*2);
  4841. LineSkip=(uiDestPitchBYTES-(BlitLength*2));
  4842. if(hSrcVObject->ppZStripInfo==NULL)
  4843. {
  4844. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4845. return(FALSE);
  4846. }
  4847. // setup for the z-column blitting stuff
  4848. pZInfo=hSrcVObject->ppZStripInfo[sZIndex];
  4849. if(pZInfo==NULL)
  4850. {
  4851. DebugMsg(TOPIC_VIDEOOBJECT, DBG_LEVEL_0, String("Missing Z-Strip info on multi-Z object"));
  4852. return(FALSE);
  4853. }
  4854. usZStartLevel=(UINT16)((INT16)usZValue+((INT16)pZInfo->bInitialZChange*Z_SUBLAYERS*10));
  4855. if(LeftSkip > pZInfo->ubFirstZStripWidth)
  4856. {
  4857. usZStartCols=(LeftSkip - pZInfo->ubFirstZStripWidth);
  4858. usZStartCols=20-(usZStartCols%20);
  4859. }
  4860. else if(LeftSkip < pZInfo->ubFirstZStripWidth)
  4861. usZStartCols=(UINT16)(pZInfo->ubFirstZStripWidth - LeftSkip);
  4862. else
  4863. usZStartCols=20;
  4864. // set to odd number of pixels for first column
  4865. usZColsToGo=usZStartCols;
  4866. pZArray=pZInfo->pbZChange;
  4867. if(LeftSkip >= usZColsToGo)
  4868. {
  4869. // Index into array after doing left clipping
  4870. usZStartIndex=1 + ((LeftSkip-pZInfo->ubFirstZStripWidth)/20);
  4871. //calculates the Z-value after left-side clipping
  4872. if(usZStartIndex)
  4873. {
  4874. for(usCount=0; usCount < usZStartIndex; usCount++)
  4875. {
  4876. switch(pZArray[usCount])
  4877. {
  4878. case -1: usZStartLevel-=Z_SUBLAYERS;
  4879. break;
  4880. case 0: //no change
  4881. break;
  4882. case 1: usZStartLevel+=Z_SUBLAYERS;
  4883. break;
  4884. }
  4885. }
  4886. }
  4887. }
  4888. else
  4889. usZStartIndex=0;
  4890. usZLevel=usZStartLevel;
  4891. usZIndex=usZStartIndex;
  4892. __asm {
  4893. mov esi, SrcPtr
  4894. mov edi, DestPtr
  4895. mov edx, p16BPPPalette
  4896. xor eax, eax
  4897. mov ebx, ZPtr
  4898. xor ecx, ecx
  4899. cmp TopSkip, 0 // check for nothing clipped on top
  4900. je LeftSkipSetup
  4901. // Skips the number of lines clipped at the top
  4902. TopSkipLoop:
  4903. mov cl, [esi]
  4904. inc esi
  4905. or cl, cl
  4906. js TopSkipLoop
  4907. jz TSEndLine
  4908. add esi, ecx
  4909. jmp TopSkipLoop
  4910. TSEndLine:
  4911. dec TopSkip
  4912. jnz TopSkipLoop
  4913. // Start of line loop
  4914. // Skips the pixels hanging outside the left-side boundry
  4915. LeftSkipSetup:
  4916. mov Unblitted, 0 // Unblitted counts any pixels left from a run
  4917. mov eax, LeftSkip // after we have skipped enough left-side pixels
  4918. mov LSCount, eax // LSCount counts how many pixels skipped so far
  4919. or eax, eax
  4920. jz BlitLineSetup // check for nothing to skip
  4921. LeftSkipLoop:
  4922. mov cl, [esi]
  4923. inc esi
  4924. or cl, cl
  4925. js LSTrans
  4926. cmp ecx, LSCount
  4927. je LSSkip2 // if equal, skip whole, and start blit with new run
  4928. jb LSSkip1 // if less, skip whole thing
  4929. add esi, LSCount // skip partial run, jump into normal loop for rest
  4930. sub ecx, LSCount
  4931. mov eax, BlitLength
  4932. mov LSCount, eax
  4933. mov Unblitted, 0
  4934. jmp BlitNTL1 // *** jumps into non-transparent blit loop
  4935. LSSkip2:
  4936. add esi, ecx // skip whole run, and start blit with new run
  4937. jmp BlitLineSetup
  4938. LSSkip1:
  4939. add esi, ecx // skip whole run, continue skipping
  4940. sub LSCount, ecx
  4941. jmp LeftSkipLoop
  4942. LSTrans:
  4943. and ecx, 07fH
  4944. cmp ecx, LSCount
  4945. je BlitLineSetup // if equal, skip whole, and start blit with new run
  4946. jb LSTrans1 // if less, skip whole thing
  4947. sub ecx, LSCount // skip partial run, jump into normal loop for rest
  4948. mov eax, BlitLength
  4949. mov LSCount, eax
  4950. mov Unblitted, 0
  4951. jmp BlitTransparent // *** jumps into transparent blit loop
  4952. LSTrans1:
  4953. sub LSCount, ecx // skip whole run, continue skipping
  4954. jmp LeftSkipLoop
  4955. //-------------------------------------------------
  4956. // setup for beginning of line
  4957. BlitLineSetup:
  4958. mov eax, BlitLength
  4959. mov LSCount, eax
  4960. mov Unblitted, 0
  4961. BlitDispatch:
  4962. cmp LSCount, 0 // Check to see if we're done blitting
  4963. je RightSkipLoop
  4964. mov cl, [esi]
  4965. inc esi
  4966. or cl, cl
  4967. js BlitTransparent
  4968. jz RSLoop2
  4969. //--------------------------------
  4970. // blitting non-transparent pixels
  4971. and ecx, 07fH
  4972. BlitNTL1:
  4973. mov ax, [ebx] // check z-level of pixel
  4974. cmp ax, usZLevel
  4975. ja BlitNTL2
  4976. mov ax, usZLevel // update z-level of pixel
  4977. mov [ebx], ax
  4978. // Check for shadow...
  4979. xor eax, eax
  4980. mov al, [esi]
  4981. cmp al, 254
  4982. jne BlitNTL66
  4983. mov ax, [edi]
  4984. mov ax, ShadeTable[eax*2]
  4985. mov [edi], ax
  4986. jmp BlitNTL2
  4987. BlitNTL66:
  4988. mov ax, [edx+eax*2] // Copy pixel
  4989. mov [edi], ax
  4990. BlitNTL2:
  4991. inc esi
  4992. add edi, 2
  4993. add ebx, 2
  4994. dec usZColsToGo
  4995. jnz BlitNTL6
  4996. // update the z-level according to the z-table
  4997. push edx
  4998. mov edx, pZArray // get pointer to array
  4999. xor eax, eax
  5000. mov ax, usZIndex // pick up the current array index
  5001. add edx, eax
  5002. inc eax // increment it
  5003. mov usZIndex, ax // store incremented value
  5004. mov al, [edx] // get direction instruction
  5005. mov dx, usZLevel // get current z-level
  5006. or al, al
  5007. jz BlitNTL5 // dir = 0 no change
  5008. js BlitNTL4 // dir < 0 z-level down
  5009. // dir > 0 z-level up (default)
  5010. add dx, Z_SUBLAYERS
  5011. jmp BlitNTL5
  5012. BlitNTL4:
  5013. sub dx, Z_SUBLAYERS
  5014. BlitNTL5:
  5015. mov usZLevel, dx // store the now-modified z-level
  5016. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  5017. pop edx
  5018. BlitNTL6:
  5019. dec LSCount // decrement pixel length to blit
  5020. jz RightSkipLoop // done blitting the visible line
  5021. dec ecx
  5022. jnz BlitNTL1 // continue current run
  5023. jmp BlitDispatch // done current run, go for another
  5024. //----------------------------
  5025. // skipping transparent pixels
  5026. BlitTransparent: // skip transparent pixels
  5027. and ecx, 07fH
  5028. BlitTrans2:
  5029. add edi, 2 // move up the destination pointer
  5030. add ebx, 2
  5031. dec usZColsToGo
  5032. jnz BlitTrans1
  5033. // update the z-level according to the z-table
  5034. push edx
  5035. mov edx, pZArray // get pointer to array
  5036. xor eax, eax
  5037. mov ax, usZIndex // pick up the current array index
  5038. add edx, eax
  5039. inc eax // increment it
  5040. mov usZIndex, ax // store incremented value
  5041. mov al, [edx] // get direction instruction
  5042. mov dx, usZLevel // get current z-level
  5043. or al, al
  5044. jz BlitTrans5 // dir = 0 no change
  5045. js BlitTrans4 // dir < 0 z-level down
  5046. // dir > 0 z-level up (default)
  5047. add dx, Z_SUBLAYERS
  5048. jmp BlitTrans5
  5049. BlitTrans4:
  5050. sub dx, Z_SUBLAYERS
  5051. BlitTrans5:
  5052. mov usZLevel, dx // store the now-modified z-level
  5053. mov usZColsToGo, 20 // reset the next z-level change to 20 cols
  5054. pop edx
  5055. BlitTrans1:
  5056. dec LSCount // decrement the pixels to blit
  5057. jz RightSkipLoop // done the line
  5058. dec ecx
  5059. jnz BlitTrans2
  5060. jmp BlitDispatch
  5061. //---------------------------------------------
  5062. // Scans the ETRLE until it finds an EOL marker
  5063. RightSkipLoop:
  5064. RSLoop1:
  5065. mov al, [esi]
  5066. inc esi
  5067. or al, al
  5068. jnz RSLoop1
  5069. RSLoop2:
  5070. dec BlitHeight
  5071. jz BlitDone
  5072. add edi, LineSkip
  5073. add ebx, LineSkip
  5074. // reset all the z-level stuff for a new line
  5075. mov ax, usZStartLevel
  5076. mov usZLevel, ax
  5077. mov ax, usZStartIndex
  5078. mov usZIndex, ax
  5079. mov ax, usZStartCols
  5080. mov usZColsToGo, ax
  5081. jmp LeftSkipSetup
  5082. BlitDone:
  5083. }
  5084. return(TRUE);
  5085. }
  5086. void RenderRoomInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
  5087. {
  5088. INT8 bXOddFlag = 0;
  5089. INT16 sAnchorPosX_M, sAnchorPosY_M;
  5090. INT16 sAnchorPosX_S, sAnchorPosY_S;
  5091. INT16 sTempPosX_M, sTempPosY_M;
  5092. INT16 sTempPosX_S, sTempPosY_S;
  5093. BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
  5094. UINT16 usTileIndex;
  5095. INT16 sX, sY;
  5096. UINT32 uiDestPitchBYTES;
  5097. UINT8 *pDestBuf;
  5098. // Begin Render Loop
  5099. sAnchorPosX_M = sStartPointX_M;
  5100. sAnchorPosY_M = sStartPointY_M;
  5101. sAnchorPosX_S = sStartPointX_S;
  5102. sAnchorPosY_S = sStartPointY_S;
  5103. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  5104. do
  5105. {
  5106. fEndRenderRow = FALSE;
  5107. sTempPosX_M = sAnchorPosX_M;
  5108. sTempPosY_M = sAnchorPosY_M;
  5109. sTempPosX_S = sAnchorPosX_S;
  5110. sTempPosY_S = sAnchorPosY_S;
  5111. if(bXOddFlag > 0)
  5112. sTempPosX_S += 20;
  5113. do
  5114. {
  5115. usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
  5116. if ( usTileIndex < GRIDSIZE )
  5117. {
  5118. sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
  5119. sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
  5120. // THIS ROOM STUFF IS ONLY DONE IN THE EDITOR...
  5121. // ADJUST BY SHEIGHT
  5122. sY -= gpWorldLevelData[ usTileIndex ].sHeight;
  5123. //sY += gsRenderHeight;
  5124. if ( gubWorldRoomInfo[ usTileIndex ] != NO_ROOM )
  5125. {
  5126. SetFont( SMALLCOMPFONT );
  5127. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
  5128. switch( gubWorldRoomInfo[ usTileIndex ] % 5 )
  5129. {
  5130. case 0: SetFontForeground( FONT_GRAY3 ); break;
  5131. case 1: SetFontForeground( FONT_YELLOW ); break;
  5132. case 2: SetFontForeground( FONT_LTRED ); break;
  5133. case 3: SetFontForeground( FONT_LTBLUE ); break;
  5134. case 4: SetFontForeground( FONT_LTGREEN );break;
  5135. }
  5136. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gubWorldRoomInfo[ usTileIndex ] );
  5137. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  5138. }
  5139. }
  5140. sTempPosX_S += 40;
  5141. sTempPosX_M ++;
  5142. sTempPosY_M --;
  5143. if ( sTempPosX_S >= sEndXS )
  5144. {
  5145. fEndRenderRow = TRUE;
  5146. }
  5147. } while( !fEndRenderRow );
  5148. if ( bXOddFlag > 0 )
  5149. {
  5150. sAnchorPosY_M ++;
  5151. }
  5152. else
  5153. {
  5154. sAnchorPosX_M ++;
  5155. }
  5156. bXOddFlag = !bXOddFlag;
  5157. sAnchorPosY_S += 10;
  5158. if ( sAnchorPosY_S >= sEndYS )
  5159. {
  5160. fEndRenderCol = TRUE;
  5161. }
  5162. }
  5163. while( !fEndRenderCol );
  5164. UnLockVideoSurface( FRAME_BUFFER );
  5165. }
  5166. #ifdef _DEBUG
  5167. void RenderFOVDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
  5168. {
  5169. INT8 bXOddFlag = 0;
  5170. INT16 sAnchorPosX_M, sAnchorPosY_M;
  5171. INT16 sAnchorPosX_S, sAnchorPosY_S;
  5172. INT16 sTempPosX_M, sTempPosY_M;
  5173. INT16 sTempPosX_S, sTempPosY_S;
  5174. BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
  5175. UINT16 usTileIndex;
  5176. INT16 sX, sY;
  5177. UINT32 uiDestPitchBYTES;
  5178. UINT8 *pDestBuf;
  5179. // Begin Render Loop
  5180. sAnchorPosX_M = sStartPointX_M;
  5181. sAnchorPosY_M = sStartPointY_M;
  5182. sAnchorPosX_S = sStartPointX_S;
  5183. sAnchorPosY_S = sStartPointY_S;
  5184. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  5185. do
  5186. {
  5187. fEndRenderRow = FALSE;
  5188. sTempPosX_M = sAnchorPosX_M;
  5189. sTempPosY_M = sAnchorPosY_M;
  5190. sTempPosX_S = sAnchorPosX_S;
  5191. sTempPosY_S = sAnchorPosY_S;
  5192. if(bXOddFlag > 0)
  5193. sTempPosX_S += 20;
  5194. do
  5195. {
  5196. usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
  5197. if ( usTileIndex < GRIDSIZE )
  5198. {
  5199. sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
  5200. sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
  5201. // Adjust for interface level
  5202. sY -= gpWorldLevelData[ usTileIndex ].sHeight;
  5203. sY += gsRenderHeight;
  5204. if ( gubFOVDebugInfoInfo[ usTileIndex ] != 0 )
  5205. {
  5206. SetFont( SMALLCOMPFONT );
  5207. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
  5208. SetFontForeground( FONT_GRAY3 );
  5209. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gubFOVDebugInfoInfo[ usTileIndex ] );
  5210. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  5211. Blt8BPPDataTo16BPPBufferTransparentClip((UINT16*)pDestBuf, uiDestPitchBYTES, gTileDatabase[0].hTileSurface, sTempPosX_S, sTempPosY_S, 0, &gClippingRect );
  5212. }
  5213. if ( gubGridNoMarkers[ usTileIndex ] == gubGridNoValue )
  5214. {
  5215. SetFont( SMALLCOMPFONT );
  5216. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
  5217. SetFontForeground( FONT_FCOLOR_YELLOW );
  5218. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY + 4 , L"x" );
  5219. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  5220. }
  5221. }
  5222. sTempPosX_S += 40;
  5223. sTempPosX_M ++;
  5224. sTempPosY_M --;
  5225. if ( sTempPosX_S >= sEndXS )
  5226. {
  5227. fEndRenderRow = TRUE;
  5228. }
  5229. } while( !fEndRenderRow );
  5230. if ( bXOddFlag > 0 )
  5231. {
  5232. sAnchorPosY_M ++;
  5233. }
  5234. else
  5235. {
  5236. sAnchorPosX_M ++;
  5237. }
  5238. bXOddFlag = !bXOddFlag;
  5239. sAnchorPosY_S += 10;
  5240. if ( sAnchorPosY_S >= sEndYS )
  5241. {
  5242. fEndRenderCol = TRUE;
  5243. }
  5244. }
  5245. while( !fEndRenderCol );
  5246. UnLockVideoSurface( FRAME_BUFFER );
  5247. }
  5248. void RenderCoverDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
  5249. {
  5250. INT8 bXOddFlag = 0;
  5251. INT16 sAnchorPosX_M, sAnchorPosY_M;
  5252. INT16 sAnchorPosX_S, sAnchorPosY_S;
  5253. INT16 sTempPosX_M, sTempPosY_M;
  5254. INT16 sTempPosX_S, sTempPosY_S;
  5255. BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
  5256. UINT16 usTileIndex;
  5257. INT16 sX, sY;
  5258. UINT32 uiDestPitchBYTES;
  5259. UINT8 *pDestBuf;
  5260. // Begin Render Loop
  5261. sAnchorPosX_M = sStartPointX_M;
  5262. sAnchorPosY_M = sStartPointY_M;
  5263. sAnchorPosX_S = sStartPointX_S;
  5264. sAnchorPosY_S = sStartPointY_S;
  5265. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  5266. do
  5267. {
  5268. fEndRenderRow = FALSE;
  5269. sTempPosX_M = sAnchorPosX_M;
  5270. sTempPosY_M = sAnchorPosY_M;
  5271. sTempPosX_S = sAnchorPosX_S;
  5272. sTempPosY_S = sAnchorPosY_S;
  5273. if(bXOddFlag > 0)
  5274. sTempPosX_S += 20;
  5275. do
  5276. {
  5277. usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
  5278. if ( usTileIndex < GRIDSIZE )
  5279. {
  5280. sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
  5281. sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
  5282. // Adjust for interface level
  5283. sY -= gpWorldLevelData[ usTileIndex ].sHeight;
  5284. sY += gsRenderHeight;
  5285. if (gsCoverValue[ usTileIndex] != 0x7F7F)
  5286. {
  5287. SetFont( SMALLCOMPFONT );
  5288. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
  5289. if (usTileIndex == gsBestCover)
  5290. {
  5291. SetFontForeground( FONT_MCOLOR_RED );
  5292. }
  5293. else if (gsCoverValue[ usTileIndex ] < 0)
  5294. {
  5295. SetFontForeground( FONT_MCOLOR_WHITE );
  5296. }
  5297. else
  5298. {
  5299. SetFontForeground( FONT_GRAY3 );
  5300. }
  5301. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", gsCoverValue[ usTileIndex ] );
  5302. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  5303. }
  5304. }
  5305. sTempPosX_S += 40;
  5306. sTempPosX_M ++;
  5307. sTempPosY_M --;
  5308. if ( sTempPosX_S >= sEndXS )
  5309. {
  5310. fEndRenderRow = TRUE;
  5311. }
  5312. } while( !fEndRenderRow );
  5313. if ( bXOddFlag > 0 )
  5314. {
  5315. sAnchorPosY_M ++;
  5316. }
  5317. else
  5318. {
  5319. sAnchorPosX_M ++;
  5320. }
  5321. bXOddFlag = !bXOddFlag;
  5322. sAnchorPosY_S += 10;
  5323. if ( sAnchorPosY_S >= sEndYS )
  5324. {
  5325. fEndRenderCol = TRUE;
  5326. }
  5327. }
  5328. while( !fEndRenderCol );
  5329. UnLockVideoSurface( FRAME_BUFFER );
  5330. }
  5331. void RenderGridNoVisibleDebugInfo( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
  5332. {
  5333. INT8 bXOddFlag = 0;
  5334. INT16 sAnchorPosX_M, sAnchorPosY_M;
  5335. INT16 sAnchorPosX_S, sAnchorPosY_S;
  5336. INT16 sTempPosX_M, sTempPosY_M;
  5337. INT16 sTempPosX_S, sTempPosY_S;
  5338. BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
  5339. UINT16 usTileIndex;
  5340. INT16 sX, sY;
  5341. UINT32 uiDestPitchBYTES;
  5342. UINT8 *pDestBuf;
  5343. // Begin Render Loop
  5344. sAnchorPosX_M = sStartPointX_M;
  5345. sAnchorPosY_M = sStartPointY_M;
  5346. sAnchorPosX_S = sStartPointX_S;
  5347. sAnchorPosY_S = sStartPointY_S;
  5348. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  5349. do
  5350. {
  5351. fEndRenderRow = FALSE;
  5352. sTempPosX_M = sAnchorPosX_M;
  5353. sTempPosY_M = sAnchorPosY_M;
  5354. sTempPosX_S = sAnchorPosX_S;
  5355. sTempPosY_S = sAnchorPosY_S;
  5356. if(bXOddFlag > 0)
  5357. sTempPosX_S += 20;
  5358. do
  5359. {
  5360. usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
  5361. if ( usTileIndex < GRIDSIZE )
  5362. {
  5363. sX = sTempPosX_S + ( WORLD_TILE_X / 2 ) - 5;
  5364. sY = sTempPosY_S + ( WORLD_TILE_Y / 2 ) - 5;
  5365. // Adjust for interface level
  5366. sY -= gpWorldLevelData[ usTileIndex ].sHeight;
  5367. sY += gsRenderHeight;
  5368. SetFont( SMALLCOMPFONT );
  5369. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, gsVIEWPORT_END_Y, FALSE );
  5370. if ( !GridNoOnVisibleWorldTile( usTileIndex ) )
  5371. {
  5372. SetFontForeground( FONT_MCOLOR_RED );
  5373. }
  5374. else
  5375. {
  5376. SetFontForeground( FONT_GRAY3 );
  5377. }
  5378. mprintf_buffer( pDestBuf, uiDestPitchBYTES, TINYFONT1, sX, sY , L"%d", usTileIndex );
  5379. SetFontDestBuffer( FRAME_BUFFER , 0, 0, 640, 480, FALSE );
  5380. }
  5381. sTempPosX_S += 40;
  5382. sTempPosX_M ++;
  5383. sTempPosY_M --;
  5384. if ( sTempPosX_S >= sEndXS )
  5385. {
  5386. fEndRenderRow = TRUE;
  5387. }
  5388. } while( !fEndRenderRow );
  5389. if ( bXOddFlag > 0 )
  5390. {
  5391. sAnchorPosY_M ++;
  5392. }
  5393. else
  5394. {
  5395. sAnchorPosX_M ++;
  5396. }
  5397. bXOddFlag = !bXOddFlag;
  5398. sAnchorPosY_S += 10;
  5399. if ( sAnchorPosY_S >= sEndYS )
  5400. {
  5401. fEndRenderCol = TRUE;
  5402. }
  5403. }
  5404. while( !fEndRenderCol );
  5405. UnLockVideoSurface( FRAME_BUFFER );
  5406. }
  5407. #endif
  5408. void ExamineZBufferRect( INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom)
  5409. {
  5410. CalcRenderParameters( sLeft, sTop, sRight, sBottom );
  5411. ExamineZBufferForHiddenTiles( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  5412. }
  5413. void ExamineZBufferForHiddenTiles( INT16 sStartPointX_M, INT16 sStartPointY_M, INT16 sStartPointX_S, INT16 sStartPointY_S, INT16 sEndXS, INT16 sEndYS )
  5414. {
  5415. INT8 bXOddFlag = 0;
  5416. INT16 sAnchorPosX_M, sAnchorPosY_M;
  5417. INT16 sAnchorPosX_S, sAnchorPosY_S;
  5418. INT16 sTempPosX_M, sTempPosY_M;
  5419. INT16 sTempPosX_S, sTempPosY_S;
  5420. BOOLEAN fEndRenderRow = FALSE, fEndRenderCol = FALSE;
  5421. UINT16 usTileIndex;
  5422. INT16 sX, sY, sWorldX, sZLevel;
  5423. UINT32 uiDestPitchBYTES;
  5424. UINT8 *pDestBuf;
  5425. TILE_ELEMENT *TileElem;
  5426. INT8 bBlitClipVal;
  5427. LEVELNODE *pObject;
  5428. // Begin Render Loop
  5429. sAnchorPosX_M = sStartPointX_M;
  5430. sAnchorPosY_M = sStartPointY_M;
  5431. sAnchorPosX_S = sStartPointX_S;
  5432. sAnchorPosY_S = sStartPointY_S;
  5433. pDestBuf = LockVideoSurface( FRAME_BUFFER, &uiDestPitchBYTES );
  5434. // Get VObject for firt land peice!
  5435. TileElem = &(gTileDatabase[ FIRSTTEXTURE1 ] );
  5436. do
  5437. {
  5438. fEndRenderRow = FALSE;
  5439. sTempPosX_M = sAnchorPosX_M;
  5440. sTempPosY_M = sAnchorPosY_M;
  5441. sTempPosX_S = sAnchorPosX_S;
  5442. sTempPosY_S = sAnchorPosY_S;
  5443. if(bXOddFlag > 0)
  5444. sTempPosX_S += 20;
  5445. do
  5446. {
  5447. usTileIndex=FASTMAPROWCOLTOPOS( sTempPosY_M, sTempPosX_M );
  5448. if ( usTileIndex < GRIDSIZE )
  5449. {
  5450. // ATE: Don;t let any vehicle sit here....
  5451. if ( FindStructure( usTileIndex, ( STRUCTURE_MOBILE ) ) )
  5452. {
  5453. // Continue...
  5454. goto ENDOFLOOP;
  5455. }
  5456. sX = sTempPosX_S;
  5457. sY = sTempPosY_S - gpWorldLevelData[usTileIndex].sHeight;
  5458. // Adjust for interface level
  5459. sY += gsRenderHeight;
  5460. // Caluluate zvalue
  5461. // Look for anything less than struct layer!
  5462. GetWorldXYAbsoluteScreenXY( sTempPosX_M, sTempPosY_M, &sWorldX, &sZLevel);
  5463. sZLevel += gsRenderHeight;
  5464. sZLevel=(sZLevel*Z_SUBLAYERS)+STRUCT_Z_LEVEL;
  5465. if ( gpWorldLevelData[usTileIndex].uiFlags & MAPELEMENT_REEVALUATE_REDUNDENCY )
  5466. {
  5467. bBlitClipVal = BltIsClippedOrOffScreen(TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex, &gClippingRect);
  5468. if ( bBlitClipVal == FALSE )
  5469. {
  5470. // Set flag to not evaluate again!
  5471. gpWorldLevelData[usTileIndex].uiFlags &= (~MAPELEMENT_REEVALUATE_REDUNDENCY );
  5472. // OK, first do some rules with exceptions
  5473. // Don't let this happen for roads!
  5474. pObject = gpWorldLevelData[usTileIndex ].pObjectHead;
  5475. if ( IsTileRedundent( gpZBuffer, sZLevel, TileElem->hTileSurface, sX, sY, TileElem->usRegionIndex ) )
  5476. {
  5477. // Mark in the world!
  5478. gpWorldLevelData[ usTileIndex ].uiFlags |= MAPELEMENT_REDUNDENT;
  5479. }
  5480. else
  5481. {
  5482. // Un Mark in the world!
  5483. gpWorldLevelData[ usTileIndex ].uiFlags &= (~MAPELEMENT_REDUNDENT);
  5484. }
  5485. }
  5486. }
  5487. }
  5488. ENDOFLOOP:
  5489. sTempPosX_S += 40;
  5490. sTempPosX_M ++;
  5491. sTempPosY_M --;
  5492. if ( sTempPosX_S >= sEndXS )
  5493. {
  5494. fEndRenderRow = TRUE;
  5495. }
  5496. } while( !fEndRenderRow );
  5497. if ( bXOddFlag > 0 )
  5498. {
  5499. sAnchorPosY_M ++;
  5500. }
  5501. else
  5502. {
  5503. sAnchorPosX_M ++;
  5504. }
  5505. bXOddFlag = !bXOddFlag;
  5506. sAnchorPosY_S += 10;
  5507. if ( sAnchorPosY_S >= sEndYS )
  5508. {
  5509. fEndRenderCol = TRUE;
  5510. }
  5511. }
  5512. while( !fEndRenderCol );
  5513. UnLockVideoSurface( FRAME_BUFFER );
  5514. }
  5515. void CalcRenderParameters(INT16 sLeft, INT16 sTop, INT16 sRight, INT16 sBottom )
  5516. {
  5517. INT16 sTempPosX_W, sTempPosY_W;
  5518. INT16 sRenderCenterX_W, sRenderCenterY_W;
  5519. INT16 sOffsetX_W, sOffsetY_W, sOffsetX_S, sOffsetY_S;
  5520. gOldClipRect = gClippingRect;
  5521. // Set new clipped rect
  5522. gClippingRect.iLeft = __max( gsVIEWPORT_START_X, sLeft);
  5523. gClippingRect.iRight = __min( gsVIEWPORT_END_X, sRight);
  5524. gClippingRect.iTop = __max( gsVIEWPORT_WINDOW_START_Y, sTop);
  5525. gClippingRect.iBottom = __min(gsVIEWPORT_WINDOW_END_Y, sBottom);
  5526. gsEndXS = sRight + VIEWPORT_XOFFSET_S;
  5527. gsEndYS = sBottom + VIEWPORT_YOFFSET_S;
  5528. sRenderCenterX_W = gsRenderCenterX;
  5529. sRenderCenterY_W = gsRenderCenterY;
  5530. // STEP THREE - determine starting point in world coords
  5531. // a) Determine where in screen coords to start rendering
  5532. gsStartPointX_S = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) - (sLeft - VIEWPORT_XOFFSET_S);
  5533. gsStartPointY_S = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) - (sTop - VIEWPORT_YOFFSET_S);
  5534. // b) Convert these distances into world distances
  5535. FromScreenToCellCoordinates( gsStartPointX_S, gsStartPointY_S, &sTempPosX_W, &sTempPosY_W );
  5536. // c) World start point is Render center minus this distance
  5537. gsStartPointX_W = sRenderCenterX_W - sTempPosX_W;
  5538. gsStartPointY_W = sRenderCenterY_W - sTempPosY_W;
  5539. // NOTE: Increase X map value by 1 tile to offset where on screen we are...
  5540. if ( gsStartPointX_W > 0 )
  5541. gsStartPointX_W += CELL_X_SIZE;
  5542. // d) screen start point is screen distances minus screen center
  5543. gsStartPointX_S = sLeft - VIEWPORT_XOFFSET_S;
  5544. gsStartPointY_S = sTop - VIEWPORT_YOFFSET_S;
  5545. // STEP FOUR - Determine Start block
  5546. // a) Find start block
  5547. gsStartPointX_M = ( gsStartPointX_W ) / CELL_X_SIZE;
  5548. gsStartPointY_M = ( gsStartPointY_W ) / CELL_Y_SIZE;
  5549. // STEP 5 - Determine Deltas for center and find screen values
  5550. //Make sure these coordinates are multiples of scroll steps
  5551. sOffsetX_W = abs( gsStartPointX_W ) - ( abs( ( gsStartPointX_M * CELL_X_SIZE ) ) );
  5552. sOffsetY_W = abs( gsStartPointY_W ) - ( abs( ( gsStartPointY_M * CELL_Y_SIZE ) ) );
  5553. FromCellToScreenCoordinates( sOffsetX_W, sOffsetY_W, &sOffsetX_S, &sOffsetY_S );
  5554. if ( gsStartPointY_W < 0 )
  5555. {
  5556. gsStartPointY_S += 0;//(sOffsetY_S/2);
  5557. }
  5558. else
  5559. {
  5560. gsStartPointY_S -= sOffsetY_S;
  5561. }
  5562. gsStartPointX_S -= sOffsetX_S;
  5563. // Set globals for render offset
  5564. if ( gsRenderWorldOffsetX == -1 )
  5565. {
  5566. gsRenderWorldOffsetX = sOffsetX_S;
  5567. }
  5568. if ( gsRenderWorldOffsetY == -1 )
  5569. {
  5570. gsRenderWorldOffsetY = sOffsetY_S;
  5571. }
  5572. /////////////////////////////////////////
  5573. //ATE: CALCULATE LARGER OFFSET VALUES
  5574. gsLEndXS = sRight + LARGER_VIEWPORT_XOFFSET_S;
  5575. gsLEndYS = sBottom + LARGER_VIEWPORT_YOFFSET_S;
  5576. // STEP THREE - determine starting point in world coords
  5577. // a) Determine where in screen coords to start rendering
  5578. gsLStartPointX_S = ( ( gsVIEWPORT_END_X - gsVIEWPORT_START_X ) /2 ) - (sLeft - LARGER_VIEWPORT_XOFFSET_S);
  5579. gsLStartPointY_S = ( ( gsVIEWPORT_END_Y - gsVIEWPORT_START_Y ) /2 ) - (sTop - LARGER_VIEWPORT_YOFFSET_S);
  5580. // b) Convert these distances into world distances
  5581. FromScreenToCellCoordinates( gsLStartPointX_S, gsLStartPointY_S, &sTempPosX_W, &sTempPosY_W );
  5582. // c) World start point is Render center minus this distance
  5583. gsLStartPointX_W = sRenderCenterX_W - sTempPosX_W;
  5584. gsLStartPointY_W = sRenderCenterY_W - sTempPosY_W;
  5585. // NOTE: Increase X map value by 1 tile to offset where on screen we are...
  5586. if ( gsLStartPointX_W > 0 )
  5587. gsLStartPointX_W += CELL_X_SIZE;
  5588. // d) screen start point is screen distances minus screen center
  5589. gsLStartPointX_S = sLeft - LARGER_VIEWPORT_XOFFSET_S;
  5590. gsLStartPointY_S = sTop - LARGER_VIEWPORT_YOFFSET_S;
  5591. // STEP FOUR - Determine Start block
  5592. // a) Find start block
  5593. gsLStartPointX_M = ( gsLStartPointX_W ) / CELL_X_SIZE;
  5594. gsLStartPointY_M = ( gsLStartPointY_W ) / CELL_Y_SIZE;
  5595. // Adjust starting screen coordinates
  5596. gsLStartPointX_S -= sOffsetX_S;
  5597. if ( gsLStartPointY_W < 0 )
  5598. {
  5599. gsLStartPointY_S += 0;
  5600. gsLStartPointX_S -= 20;
  5601. }
  5602. else
  5603. {
  5604. gsLStartPointY_S -= sOffsetY_S;
  5605. }
  5606. }
  5607. void ResetRenderParameters( )
  5608. {
  5609. // Restore clipping rect
  5610. gClippingRect = gOldClipRect;
  5611. }
  5612. BOOLEAN Zero8BPPDataTo16BPPBufferTransparent( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
  5613. {
  5614. UINT32 uiOffset;
  5615. UINT32 usHeight, usWidth;
  5616. UINT8 *SrcPtr, *DestPtr;
  5617. UINT32 LineSkip;
  5618. ETRLEObject *pTrav;
  5619. INT32 iTempX, iTempY;
  5620. // Assertions
  5621. Assert( hSrcVObject != NULL );
  5622. Assert( pBuffer != NULL );
  5623. // Get Offsets from Index into structure
  5624. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  5625. usHeight = (UINT32)pTrav->usHeight;
  5626. usWidth = (UINT32)pTrav->usWidth;
  5627. uiOffset = pTrav->uiDataOffset;
  5628. // Add to start position of dest buffer
  5629. iTempX = iX + pTrav->sOffsetX;
  5630. iTempY = iY + pTrav->sOffsetY;
  5631. // Validations
  5632. CHECKF( iTempX >= 0 );
  5633. CHECKF( iTempY >= 0 );
  5634. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  5635. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
  5636. LineSkip=(uiDestPitchBYTES-(usWidth*2));
  5637. __asm {
  5638. mov esi, SrcPtr
  5639. mov edi, DestPtr
  5640. xor eax, eax
  5641. xor ebx, ebx
  5642. xor ecx, ecx
  5643. BlitDispatch:
  5644. mov cl, [esi]
  5645. inc esi
  5646. or cl, cl
  5647. js BlitTransparent
  5648. jz BlitDoneLine
  5649. //BlitNonTransLoop:
  5650. clc
  5651. rcr cl, 1
  5652. jnc BlitNTL2
  5653. mov [edi], ax
  5654. inc esi
  5655. add edi, 2
  5656. BlitNTL2:
  5657. clc
  5658. rcr cl, 1
  5659. jnc BlitNTL3
  5660. mov [edi], ax
  5661. mov [edi+2], ax
  5662. add esi, 2
  5663. add edi, 4
  5664. BlitNTL3:
  5665. or cl, cl
  5666. jz BlitDispatch
  5667. xor ebx, ebx
  5668. BlitNTL4:
  5669. mov [edi], ax
  5670. mov [edi+2], ax
  5671. mov [edi+4], ax
  5672. mov [edi+6], ax
  5673. add esi, 4
  5674. add edi, 8
  5675. dec cl
  5676. jnz BlitNTL4
  5677. jmp BlitDispatch
  5678. BlitTransparent:
  5679. and ecx, 07fH
  5680. // shl ecx, 1
  5681. add ecx, ecx
  5682. add edi, ecx
  5683. jmp BlitDispatch
  5684. BlitDoneLine:
  5685. dec usHeight
  5686. jz BlitDone
  5687. add edi, LineSkip
  5688. jmp BlitDispatch
  5689. BlitDone:
  5690. }
  5691. return(TRUE);
  5692. }
  5693. BOOLEAN Blt8BPPDataTo16BPPBufferTransInvZ( UINT16 *pBuffer, UINT32 uiDestPitchBYTES, UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
  5694. {
  5695. UINT16 *p16BPPPalette;
  5696. UINT32 uiOffset;
  5697. UINT32 usHeight, usWidth;
  5698. UINT8 *SrcPtr, *DestPtr, *ZPtr;
  5699. UINT32 LineSkip;
  5700. ETRLEObject *pTrav;
  5701. INT32 iTempX, iTempY;
  5702. // Assertions
  5703. Assert( hSrcVObject != NULL );
  5704. Assert( pBuffer != NULL );
  5705. // Get Offsets from Index into structure
  5706. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  5707. usHeight = (UINT32)pTrav->usHeight;
  5708. usWidth = (UINT32)pTrav->usWidth;
  5709. uiOffset = pTrav->uiDataOffset;
  5710. // Add to start position of dest buffer
  5711. iTempX = iX + pTrav->sOffsetX;
  5712. iTempY = iY + pTrav->sOffsetY;
  5713. // Validations
  5714. CHECKF( iTempX >= 0 );
  5715. CHECKF( iTempY >= 0 );
  5716. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  5717. DestPtr = (UINT8 *)pBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
  5718. ZPtr = (UINT8 *)pZBuffer + (uiDestPitchBYTES*iTempY) + (iTempX*2);
  5719. p16BPPPalette = hSrcVObject->pShadeCurrent;
  5720. LineSkip=(uiDestPitchBYTES-(usWidth*2));
  5721. __asm {
  5722. mov esi, SrcPtr
  5723. mov edi, DestPtr
  5724. mov edx, p16BPPPalette
  5725. xor eax, eax
  5726. mov ebx, ZPtr
  5727. xor ecx, ecx
  5728. BlitDispatch:
  5729. mov cl, [esi]
  5730. inc esi
  5731. or cl, cl
  5732. js BlitTransparent
  5733. jz BlitDoneLine
  5734. //BlitNonTransLoop:
  5735. xor eax, eax
  5736. BlitNTL4:
  5737. mov ax, usZValue
  5738. cmp ax, [ebx]
  5739. jne BlitNTL5
  5740. //mov [ebx], ax
  5741. xor ah, ah
  5742. mov al, [esi]
  5743. mov ax, [edx+eax*2]
  5744. mov [edi], ax
  5745. BlitNTL5:
  5746. inc esi
  5747. inc edi
  5748. inc ebx
  5749. inc edi
  5750. inc ebx
  5751. dec cl
  5752. jnz BlitNTL4
  5753. jmp BlitDispatch
  5754. BlitTransparent:
  5755. and ecx, 07fH
  5756. // shl ecx, 1
  5757. add ecx, ecx
  5758. add edi, ecx
  5759. add ebx, ecx
  5760. jmp BlitDispatch
  5761. BlitDoneLine:
  5762. dec usHeight
  5763. jz BlitDone
  5764. add edi, LineSkip
  5765. add ebx, LineSkip
  5766. jmp BlitDispatch
  5767. BlitDone:
  5768. }
  5769. return(TRUE);
  5770. }
  5771. BOOLEAN IsTileRedundent( UINT16 *pZBuffer, UINT16 usZValue, HVOBJECT hSrcVObject, INT32 iX, INT32 iY, UINT16 usIndex )
  5772. {
  5773. UINT16 *p16BPPPalette;
  5774. UINT32 uiOffset;
  5775. UINT32 usHeight, usWidth;
  5776. UINT8 *SrcPtr, *ZPtr;
  5777. UINT32 LineSkip;
  5778. ETRLEObject *pTrav;
  5779. INT32 iTempX, iTempY;
  5780. BOOLEAN fHidden = TRUE;
  5781. // Assertions
  5782. Assert( hSrcVObject != NULL );
  5783. // Get Offsets from Index into structure
  5784. pTrav = &(hSrcVObject->pETRLEObject[ usIndex ] );
  5785. usHeight = (UINT32)pTrav->usHeight;
  5786. usWidth = (UINT32)pTrav->usWidth;
  5787. uiOffset = pTrav->uiDataOffset;
  5788. // Add to start position of dest buffer
  5789. iTempX = iX + pTrav->sOffsetX;
  5790. iTempY = iY + pTrav->sOffsetY;
  5791. // Validations
  5792. CHECKF( iTempX >= 0 );
  5793. CHECKF( iTempY >= 0 );
  5794. SrcPtr= (UINT8 *)hSrcVObject->pPixData + uiOffset;
  5795. ZPtr = (UINT8 *)pZBuffer + (1280*iTempY) + (iTempX*2);
  5796. p16BPPPalette = hSrcVObject->pShadeCurrent;
  5797. LineSkip=(1280-(usWidth*2));
  5798. __asm {
  5799. mov esi, SrcPtr
  5800. mov edx, p16BPPPalette
  5801. xor eax, eax
  5802. mov ebx, ZPtr
  5803. xor ecx, ecx
  5804. BlitDispatch:
  5805. mov cl, [esi]
  5806. inc esi
  5807. or cl, cl
  5808. js BlitTransparent
  5809. jz BlitDoneLine
  5810. //BlitNonTransLoop:
  5811. xor eax, eax
  5812. BlitNTL4:
  5813. mov ax, usZValue
  5814. cmp ax, [ebx]
  5815. jle BlitNTL5
  5816. // Set false, flag
  5817. mov fHidden, 0
  5818. jmp BlitDone
  5819. BlitNTL5:
  5820. inc esi
  5821. inc ebx
  5822. inc ebx
  5823. dec cl
  5824. jnz BlitNTL4
  5825. jmp BlitDispatch
  5826. BlitTransparent:
  5827. and ecx, 07fH
  5828. // shl ecx, 1
  5829. add ecx, ecx
  5830. add ebx, ecx
  5831. jmp BlitDispatch
  5832. BlitDoneLine:
  5833. dec usHeight
  5834. jz BlitDone
  5835. add ebx, LineSkip
  5836. jmp BlitDispatch
  5837. BlitDone:
  5838. }
  5839. return(fHidden);
  5840. }
  5841. void SetMercGlowFast( )
  5842. {
  5843. //gpGlowFramePointer = gsFastGlowFrames;
  5844. }
  5845. void SetMercGlowNormal( )
  5846. {
  5847. gpGlowFramePointer = gsGlowFrames;
  5848. }
  5849. #if 0
  5850. if ( gAnimControl[ pSoldier->usAnimState ].uiFlags & ANIM_MOVING )
  5851. {
  5852. if ( sZOffsetY > 0 )
  5853. {
  5854. sZOffsetY++;
  5855. }
  5856. if ( sZOffsetX > 0 )
  5857. {
  5858. sZOffsetX++;
  5859. }
  5860. }
  5861. sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
  5862. sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
  5863. if ( ( pSoldier->uiStatusFlags & SOLDIER_MULTITILE ) )\
  5864. {\
  5865. sZOffsetX = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetX;\
  5866. sZOffsetY = pNode->pStructureData->pDBStructureRef->pDBStructure->bZTileOffsetY;\
  5867. \
  5868. GetMapXYWorldY( sMapX + sZOffsetX, sMapY + sZOffsetY, sWorldY );\
  5869. }\
  5870. else
  5871. #endif
  5872. void SetRenderCenter( INT16 sNewX, INT16 sNewY )
  5873. {
  5874. if ( gfIgnoreScrolling == 1 )
  5875. {
  5876. return;
  5877. }
  5878. // Apply these new coordinates to the renderer!
  5879. ApplyScrolling( sNewX, sNewY, TRUE , FALSE );
  5880. // Set flag to ignore scrolling this frame
  5881. gfIgnoreScrollDueToCenterAdjust = TRUE;
  5882. // Set full render flag!
  5883. // DIRTY THE WORLD!
  5884. SetRenderFlags(RENDER_FLAG_FULL);
  5885. gfPlotNewMovement = TRUE;
  5886. if ( gfScrollPending == TRUE )
  5887. {
  5888. // Do a complete rebuild!
  5889. gfScrollPending = FALSE;
  5890. // Restore Interface!
  5891. RestoreInterface( );
  5892. // Delete Topmost blitters saved areas
  5893. DeleteVideoOverlaysArea( );
  5894. }
  5895. gfScrollInertia = FALSE;
  5896. }
  5897. #ifdef _DEBUG
  5898. void RenderFOVDebug( )
  5899. {
  5900. RenderFOVDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  5901. }
  5902. void RenderCoverDebug( )
  5903. {
  5904. RenderCoverDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  5905. }
  5906. void RenderGridNoVisibleDebug( )
  5907. {
  5908. RenderGridNoVisibleDebugInfo( gsStartPointX_M, gsStartPointY_M, gsStartPointX_S, gsStartPointY_S, gsEndXS, gsEndYS );
  5909. }
  5910. #endif