3DENG.C 251 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043
  1. /********************************************************/
  2. /* 3D ENGINE - Football 13/04/95 */
  3. /********************************************************/
  4. // By Laurent Noel
  5. #include "defs.h"
  6. /********************* HEADER FILES *********************/
  7. #include <stdlib.h>
  8. #include <stdio.h>
  9. #include <malloc.h>
  10. #include <math.h>
  11. #include <string.h>
  12. #include <conio.h>
  13. #include <i86.h>
  14. #include <io.h>
  15. #include <fcntl.h>
  16. #include <direct.h>
  17. #include <time.h>
  18. #include <sys\stat.h>
  19. #include "c:\sos\include\sos.h"
  20. #include "c:\cgl\cgl.h"
  21. #include "3deng.h"
  22. #include "data.h"
  23. #include "vesa.h"
  24. #include "mallocx.h"
  25. #ifdef BLASTER
  26. #include "3dblast.h"
  27. #else
  28. #include "3dbnull.h"
  29. #ifdef NEW
  30. #include "eurodefs.h"
  31. #include "euro_fxd.h"
  32. #include "euro.equ"
  33. #include "euro_sym.h"
  34. #include "euro_def.h"
  35. //#include "euro_var.h"
  36. #include "euro_mem.h"
  37. #include "euro_spt.h"
  38. #include "euro_gen.h"
  39. #include "euro_grf.h"
  40. #include "euro_cnt.h"
  41. #include "euro_dsk.h"
  42. #include "euro_sqd.h"
  43. #include "euro_sel.h"
  44. #include "euro_fix.h"
  45. #include "euro_usr.h"
  46. #include "euro_inf.h"
  47. #include "euro_gdv.h"
  48. #include "euro_win.h"
  49. //#include "euro_net.h"
  50. #include "euro_cmd.h"
  51. #include "euro_rnd.h"
  52. #include "euro_int.h"
  53. #endif
  54. #define TEMPa 0
  55. #define TEMPb 1
  56. #endif
  57. #ifdef JAPAN
  58. #include "actrend.equ"
  59. #include "fapj.equ"
  60. #include "files.c"
  61. #else
  62. #ifndef FLOPPY
  63. #include "actrend.equ"
  64. #include "fap.equ"
  65. #include "files.c"
  66. #else
  67. #ifndef BBS
  68. #include "actrendf.equ"
  69. #include "fapf.equ"
  70. #include "filesf.c"
  71. #else
  72. #include "actrendb.equ"
  73. #include "fapf.equ"
  74. #include "filesb.c"
  75. #endif
  76. #endif
  77. #endif
  78. #include "fgfx.c"
  79. #include "andydefs.h"
  80. #include "defines.h"
  81. /***************** PRE-DEFINED CONSTANTS ****************/
  82. #define SCREENDIST 15 // Screen clip plane z distance, set to avoid overflow
  83. #define CUTOFFDIST 5 // Cutoff plane z distance (can be -ve!), set for nearest visibility
  84. #define MAXOBJ 100 // Max number of objects in one sort
  85. #define MAXPOL 1000 // Max number of polys in one sort
  86. #define MAXPTS 500 // Max number of points in one object
  87. #define MAXLOOP 100 // Max number of looping maps
  88. #define MAX_FILES 500
  89. // Undefined in C++ (?!)
  90. #define min(a,b) (((a)<(b))?(a):(b))
  91. #define max(a,b) (((a)>(b))?(a):(b))
  92. #define abs(a) (((a)>=0)?(a):-(a))
  93. /*********************** PROTOTYPES *********************/
  94. // From render.c :
  95. // Line Drawing
  96. extern void line(pnt *pts,word col); // Flat colour line
  97. // Polygon drawing
  98. extern void poly(pnt *pts,word np,word col); // Flat colour overlapping
  99. extern void polyb(pnt *pts,word np,word col); // Flat colour
  100. extern void polyf(pnt *pts,word np,filter col); // Filtered
  101. extern void polyg(ppnt *pts,word np); // Gourad shading
  102. extern void polym(pnt *pts,word np,word mapsel, // Texture mapped
  103. dword *startsx,dword *startsy);
  104. extern void polyl(pnt *pts,word np,word mapsel, // Looping texture mapped
  105. dword *startsx,dword *startsy);
  106. extern void polyt(pnt *pts,word np,word mapsel, // Transparent texture mapped
  107. dword *startsx, dword *startsy);
  108. extern void polyq(zpnt *pts,word np,BYTE *map, // Bi-Quadratic texture mapped
  109. dword *startsx, dword *startsy);
  110. extern void sprite3d(short x,short y,short ref); // Depth sorted sprites
  111. // Dumps for various buffer types
  112. void dumpMCGA(scrpt dispx,scrpt dispy);
  113. void dumpMCGAs(scrpt dispx,scrpt dispy);
  114. void dumpV256(scrpt dispx,scrpt dispy);
  115. void dump3DB(scrpt dispx,scrpt dispy);
  116. void dumpvidi1(scrpt dispx,scrpt dispy);
  117. void dumpnull(scrpt dispx,scrpt dispy);
  118. // Miscellaneous
  119. extern int w95; // Are we in Windows 95 (AAAARRRRRGGGGHHHHH!!!!)
  120. extern float log_factor; // No of logic frames/update
  121. extern int testVESA;
  122. extern char match_half;
  123. extern char match_mode;
  124. void draw_sprite(buff_info *buff,int sprite_no,int x,int y,BYTE col);
  125. int draw_string(buff_info *buff,int font_no,int x,int y,char *string,BYTE col,short just);
  126. #ifdef LINK
  127. extern "C" char keys[128]; // Key pressed array (indexed by scan-code)
  128. extern "C" char key_togs[128];// Key toggled array (indexed by scan-code)
  129. extern "C" int icth,isth; // Integer cos and sin of theta
  130. extern "C" volatile int count;// Timer count
  131. extern "C" network_on; // Network game
  132. #else
  133. extern char keys[128]; // Key pressed array (indexed by scan-code)
  134. extern char key_togs[128]; // Key toggled array (indexed by scan-code)
  135. extern int icth,isth; // Integer cos and sin of theta
  136. extern volatile int count; // Timer count
  137. extern network_on; // Network game
  138. #endif
  139. // Wind data
  140. extern short wind_on;
  141. extern float wind_x,wind_y;
  142. extern float wind_speed;
  143. /********************** GLOBAL VARS *********************/
  144. // Setup data
  145. setup_info setup; // Initialisation data
  146. int performance; // Machine performance index
  147. // Screen buffer info
  148. buff_info main_buff; // Current main screen buffer info
  149. buff_info vidi_buff; // Current vidi-buffer info
  150. buff_info menu_buff; // Current menu buffer info
  151. buff_info_ext render_buff; // Extended buffer info for rendering
  152. word scrmode; // (S)VGA mode number (including VESA)
  153. word scrmode3DB; // 3D Blaster mode number (-ve if not available)
  154. CGL_COLOR_ST backcol={199,199,199,0}; // 3D Blaster background colour (temporary)
  155. word menx3DB,meny3DB; // Offset for menus on 3D Blastter
  156. int mappages; // No of texture-map pages being used
  157. int texaddr3DB[16]; // Internal 3DB addresses for gfx
  158. int skyaddr3DB,pitchaddr3DB; // Internal 3DB addresses for gfx
  159. BYTE *scr=(BYTE *)0xa0000; // Address of (S)VGA display.
  160. // Viewpoint vars
  161. floatpt cth,sth,cph,sph; // Cos & sin of theta and phi, the viewing angles
  162. short q,oq; // Perspective scaling
  163. floatpt qr,qa; // Precalculations derived from above
  164. floatpt scrdr,persc; // Used for 'alternative perspective scaling', see below
  165. qmat rot,tran; // Quick matrices for view and object rotation
  166. // Object/polygon/point lists
  167. objs *objlist; // List of objects [object z, object polygon list]
  168. objs *curobj; // Current object pointer
  169. pols *pollist; // List of polygons [polygon z, polygon point list]
  170. pols *curpol; // Current polygon pointer
  171. scrpt *ptslist; // List of polygon point data [nsides, col, nsides*{x,y}]
  172. scrpt *curpts; // Current point pointer(!)
  173. rotpt *rotlist; // List of rotated pts for object
  174. CGL_VERTEX2D_ST *curpts3DB; // For 3D Blaster sprites
  175. CGL_TEXTURE2D_ST *curtex3DB; // --"--
  176. int clip_tex; // Current clip texture map
  177. plyrdat *ppt;
  178. int timeit=0;
  179. BYTE *dumplbm;
  180. char dumpstr[]="dumpa.tga";
  181. #ifdef COUNT
  182. int numpols; // Count for number of polygons drawn
  183. #endif
  184. floatpt mcap_ballx,mcap_bally,mcap_ballz;
  185. /***************** INITIALISED STRUCTURES ***************/
  186. // Unit matrix
  187. mat unit=
  188. {
  189. {1.,0.,0.,0.},
  190. {0.,1.,0.,0.},
  191. {0.,0.,1.,0.},
  192. {0.,0.,0.,1.},
  193. };
  194. //////////////////
  195. // MEMORY AREAS //
  196. // Texture map pages
  197. #define X_BM 6 // Bitmap offset for extra maps
  198. #define S_BM 8 // Bitmap offset for stand maps
  199. #ifdef NEW
  200. #define MAPPAGES (S_BM+8)
  201. #else
  202. #define MAPPAGES (S_BM+7)
  203. #endif
  204. #define MAPPAGES_4 (S_BM+2)
  205. typedef BYTE mappage[256*256];
  206. mappage *maps;
  207. word mapsel[MAPPAGES+MAXLOOP+1];
  208. BYTE *sky; // Sky map
  209. BYTE pitch3DB[64*64]; // Pitch map (3D Blaster)
  210. /////////////////
  211. // SCREEN INFO //
  212. // Space for main screen buffer
  213. BYTE *scrb;
  214. // VESA mode list
  215. #define VESAMODES 2
  216. int modelist[VESAMODES+1]={0x100,0x101,-1};
  217. // Screen buffer information (w%8=0,h%2=0)
  218. #define SCRSIZES 10
  219. buff_info MCGA_buff[SCRSIZES]=
  220. {
  221. {NULL, 320,200, 320,200, 0.5, 0.5, dumpMCGA},
  222. {NULL, 320,200, 296,184, 0.4625,0.46, dumpMCGA},
  223. {NULL, 320,200, 320,158, 0.5, 0.3975,dumpMCGA},
  224. {NULL, 320,200, 264,166, 0.4125,0.4175,dumpMCGA},
  225. {NULL, 320,200, 296,142, 0.4625,0.355, dumpMCGA},
  226. {NULL, 320,200, 240,150, 0.375, 0.375, dumpMCGA},
  227. {NULL, 320,200, 264,124, 0.4125,0.3125,dumpMCGA},
  228. {NULL, 320,200, 216,132, 0.3375,0.3325,dumpMCGA},
  229. {NULL, 320,200, 240,108, 0.375, 0.2725,dumpMCGA},
  230. {NULL, 320,200, 216, 92, 0.3375,0.23, dumpMCGA},
  231. };
  232. buff_info VESA_buff[VESAMODES][SCRSIZES]=
  233. {
  234. {
  235. {NULL, 640,400, 640,400, 1, 1, dumpV256},
  236. {NULL, 640,400, 584,366, 0.9125,0.9175,dumpV256},
  237. {NULL, 640,400, 640,316, 1, 0.79, dumpV256},
  238. {NULL, 640,400, 528,332, 0.825, 0.8325,dumpV256},
  239. {NULL, 640,400, 584,284, 0.9125,0.71, dumpV256},
  240. {NULL, 640,400, 480,300, 0.75, 0.75, dumpV256},
  241. {NULL, 640,400, 528,250, 0.825, 0.625, dumpV256},
  242. {NULL, 640,400, 424,266, 0.6625,0.6675,dumpV256},
  243. {NULL, 640,400, 480,216, 0.75, 0.54, dumpV256},
  244. {NULL, 640,400, 424,184, 0.6625,0.46, dumpV256},
  245. },
  246. {
  247. {NULL, 640,480, 640,480, 1, 1.2, dumpV256},
  248. {NULL, 640,480, 584,440, 0.9125,1.1, dumpV256},
  249. {NULL, 640,480, 640,380, 1, 0.95,dumpV256},
  250. {NULL, 640,480, 528,400, 0.825, 1, dumpV256},
  251. {NULL, 640,480, 584,340, 0.9125,0.85,dumpV256},
  252. {NULL, 640,480, 480,360, 0.75, 0.9, dumpV256},
  253. {NULL, 640,480, 528,300, 0.825, 0.75,dumpV256},
  254. {NULL, 640,480, 424,320, 0.6625,0.8, dumpV256},
  255. {NULL, 640,480, 480,260, 0.75, 0.65,dumpV256},
  256. {NULL, 640,480, 424,220, 0.6625,0.55,dumpV256},
  257. },
  258. };
  259. #define MODES_3DB 6
  260. #ifndef BLASTDEMO
  261. int modelist3DB[MODES_3DB+1]={0,3,5,-1};
  262. int modelist3DBh[MODES_3DB+1]={0,3,5,-1};
  263. #else
  264. int modelist3DB[MODES_3DB+1]={3,4,5,3,4,5,-1};
  265. //int modelist3DB[MODES_3DB+1]={0,1,2,3,4,5,-1};
  266. int modelist3DBh[MODES_3DB+1]={3,4,5,3,4,5,-1};
  267. //int modelist3DBh[MODES_3DB+1]={3,4,5,0,1,2,-1};
  268. #endif
  269. buff_info buff_3DB[MODES_3DB]=
  270. {
  271. {NULL, 320,200, 320,200, 0.5, 0.5, dump3DB},
  272. {NULL, 320,240, 320,240, 0.5, 0.6, dump3DB},
  273. {NULL, 640,350, 640,350, 1, 0.875, dump3DB},
  274. {NULL, 640,400, 640,400, 1, 1, dump3DB},
  275. {NULL, 640,480, 640,480, 1, 1.2, dump3DB},
  276. {NULL, 800,600, 800,600, 1.25, 1.5, dump3DB},
  277. };
  278. buff_info vidi_buff_1={NULL, 256,256, 128,80, 0.175,0.183, dumpnull};
  279. buff_info vidi_buff_2={NULL, 256,256, 128,80, 0.175,0.183, dumpvidi1};
  280. // Palette
  281. BYTE pal[768];
  282. // Polygon filters
  283. #define FILTERS 2
  284. filter *filters;
  285. //////////////////////
  286. // TEXTURE MAP INFO //
  287. // Team players:
  288. // Texture 13 (1+12): Head A (End 61 (1+5*12))
  289. // Texture 73 (61+12): Head B (End 121 (61+5*12))
  290. // Texture 133 (121+12): Torso A (End 181 (121+5*12))
  291. // Texture 193 (181+12): Torso B (End 241 (181+5*12))
  292. // Texture 244 (241+3): Lower Leg A (End 248 (241+7))
  293. // Texture 251 (248+3): Upper Arm A (End 255 (248+7))
  294. // Texture 258 (255+3): Upper Leg A (End 262 (255+7))
  295. // Texture 265 (262+3): Lower Arm A (End 269 (262+7))
  296. // Texture 272 (269+3): Lower Leg B (End 276 (269+7))
  297. // Texture 279 (276+3): Upper Arm B (End 283 (276+7))
  298. // Texture 286 (283+3): Upper Leg B (End 290 (283+7))
  299. // Texture 293 (290+3): Lower Arm B (End 297 (290+7))
  300. // Texture 309 (297+12): Foot (End 357 (297+5*12))
  301. // Referee & keeper:
  302. // Texture 369 (357+12): Torso Referee (End 417 (357+5*12))
  303. // Texture 429 (417+12): Torso Keeper (End 477 (417+5*12))
  304. // Texture 480 (477+3): Lower Leg Referee (End 484 (477+7))
  305. // Texture 487 (484+3): Upper Arm Referee (End 491 (484+7))
  306. // Texture 494 (491+3): Upper Leg Referee (End 498 (491+7))
  307. // Texture 501 (498+3): Lower Arm Referee (End 505 (498+7))
  308. // Texture 508 (505+3): Lower Leg Keeper (End 512 (505+7))
  309. // Texture 515 (512+3): Upper Arm Keeper (End 519 (512+7))
  310. // Texture 522 (519+3): Upper Leg Keeper (End 526 (519+7))
  311. // Texture 529 (526+3): Lower Arm Keeper (End 533 (526+7))
  312. #define X_TM 533 // Offset for extra maps
  313. #define X_TM_NO (52+419) // No of extra maps
  314. #define N_TM (X_TM+52) // Alternate torsos
  315. #define NT_TM (N_TM+412) // Netting
  316. #define S_TM X_TM+X_TM_NO // Offset for stand maps
  317. #define S_TM_MAX 500 // Maximum no of stadium maps
  318. #define NOTEXTURES S_TM+S_TM_MAX
  319. #define CLIP_TEXTURES 200
  320. texture *textures;
  321. // Misc looping textures
  322. int noloop=6;
  323. struct {
  324. int pos;
  325. texture tex;
  326. } texloop[]=
  327. {
  328. {
  329. 0x1c040,
  330. {0x000000,0x000000,0x3fff00,0x3fff00,
  331. 0x000000,0x3fff00,0x3fff00,0x000000}
  332. },
  333. {
  334. 0x1c040,
  335. {0x000000,0x000000,0x1fff00,0x1fff00,
  336. 0x000000,0x3fff00,0x3fff00,0x000000}
  337. },
  338. {
  339. 0x1c040,
  340. {0x000000,0x000000,0x7fff00,0x7fff00,
  341. 0x000000,0x7fff00,0x7fff00,0x000000}
  342. },
  343. {
  344. 0x1c080,
  345. {0x000000,0x000000,0x3fff00,0x3fff00,
  346. 0x000000,0x7fff00,0x7fff00,0x000000}
  347. },
  348. {
  349. 0x1c040,
  350. {0x000000,0x000000,0xbfff00,0xbfff00,
  351. 0x000000,0xbfff00,0xbfff00,0x000000}
  352. },
  353. {
  354. 0x1c0c0,
  355. {0x000000,0x000000,0x5fff00,0x5fff00,
  356. 0x000000,0xbfff00,0xbfff00,0x000000}
  357. },
  358. };
  359. char *lang[6][29]=
  360. {
  361. {
  362. "GOAL SCORED BY: ",
  363. "BOOKED, YELLOW CARD: ",
  364. "RED CARD, SENT OFF: ",
  365. "DIRECT FREE KICK",
  366. "INDIRECT FREE KICK",
  367. "PENALTY KICK",
  368. "CORNER KICK",
  369. "THROW IN",
  370. "GOAL KICK",
  371. "KICK OFF",
  372. "OFFSIDE",
  373. "PLAYER INJURED: ",
  374. "FULL TIME",
  375. "EXTRA TIME",
  376. "HALF TIME",
  377. "PENALTY SHOOTOUT",
  378. "FINAL SCORE AFTER PENALTIES",
  379. "OWN GOAL BY: ",
  380. "REPLAY",
  381. "SUBSTITUTION",
  382. "FORMATION",
  383. "CANCEL",
  384. "SELECT",
  385. "OFF",
  386. "SUBSTITUTE",
  387. "ON",
  388. "DONE",
  389. "OPTIONS",
  390. "REFEREE : ",
  391. },
  392. {
  393. "BUT DE: ",
  394. "AVERT., C. JAUNE: ",
  395. "C. ROUGE, RENV.: ",
  396. "COUP FR. DIRECT",
  397. "COUP FR. INDIR",
  398. "PENALTY",
  399. "CORNER",
  400. "TOUCHE",
  401. "TIR AU BUT",
  402. "CP. D<ENVOI",
  403. "HORS JEU",
  404. "JOUEUR BLESSE: ",
  405. "TPS TOTAL",
  406. "PROLONG.",
  407. "MI=TEMPS",
  408. "PENALTIES",
  409. "SCORE FINAL APRES PEN.",
  410. "BUT CTRE SOM CAMP DE: ",
  411. "REPLAY",
  412. "REMPLACEMENT",
  413. "FORMATION",
  414. "ANNULER",
  415. "SELECT",
  416. "OFF",
  417. "REMPLACANT",
  418. "ON",
  419. "FAIT",
  420. "OPTIONS",
  421. "ARBITRE : ",
  422. },
  423. {
  424. "TORSCHUETZE: ",
  425. "GELBE KARTE: ",
  426. "ROTE KARTE: ",
  427. "DIREKTER FREISTOSS",
  428. "FREISTOSS",
  429. "ELFMETER",
  430. "ECKBALL",
  431. "EINWURF",
  432. "ABSTOSS",
  433. "ANSTOSS",
  434. "ABSEITS",
  435. "SPIELER VERLETZT: ",
  436. "ABPFIFF",
  437. "VERLAENGERUNG",
  438. "HALBZEIT",
  439. "ELFMETERSCHIESSEN",
  440. "ERGEBNIS NACH ELFMETERSCHIESSEN",
  441. "EIGENTOR VON ",
  442. "WIEDERHOLUNG",
  443. "AUSWECHSLUNG",
  444. "AUFSTELLUNG",
  445. "ABBRUCH",
  446. "AUSWAEHLEN",
  447. "RAUS",
  448. "AUSWECHSELN",
  449. "REIN",
  450. "FERTIG",
  451. "OPTIONEN",
  452. "SCHIEDSRICHTER : ",
  453. },
  454. {
  455. "GOAL SCORED BY: ",
  456. "BOOKED, YELLOW CARD: ",
  457. "RED CARD, SENT OFF: ",
  458. "DIRECT FREE KICK",
  459. "INDIRECT FREE KICK",
  460. "PENALTY KICK",
  461. "CORNER KICK",
  462. "THROW IN",
  463. "GOAL KICK",
  464. "KICK OFF",
  465. "OFFSIDE",
  466. "PLAYER INJURED: ",
  467. "FULL TIME",
  468. "EXTRA TIME",
  469. "HALF TIME",
  470. "PENALTY SHOOTOUT",
  471. "FINAL SCORE AFTER PENALTIES",
  472. "OWN GOAL BY: ",
  473. "REPLAY",
  474. "SUBSTITUTION",
  475. "FORMATION",
  476. "CANCEL",
  477. "SELECT",
  478. "OFF",
  479. "SUBSTITUTE",
  480. "ON",
  481. "DONE",
  482. "OPTIONS",
  483. "REFEREE : ",
  484. },
  485. {
  486. "BUT DE: ",
  487. "AVERT., C. JAUNE: ",
  488. "C. ROUGE, RENV.: ",
  489. "COUP FR. DIRECT",
  490. "COUP FR. INDIR",
  491. "PENALTY",
  492. "CORNER",
  493. "TOUCHE",
  494. "TIR AU BUT",
  495. "CP. D<ENVOI",
  496. "HORS JEU",
  497. "JOUEUR BLESSE: ",
  498. "TPS TOTAL",
  499. "PROLONG.",
  500. "MI=TEMPS",
  501. "PENALTIES",
  502. "SCORE FINAL APRES PEN.",
  503. "BUT CTRE SOM CAMP DE: ",
  504. "REPLAY",
  505. "REMPLACEMENT",
  506. "FORMATION",
  507. "ANNULER",
  508. "SELECT",
  509. "OFF",
  510. "REMPLACANT",
  511. "ON",
  512. "FAIT",
  513. "OPTIONS",
  514. "ARBITRE : ",
  515. },
  516. {
  517. "M>L SCORET AV: ",
  518. "GULT KORT: ",
  519. "R&DT KORT, SENDT UT: ",
  520. "DIREKTE FRISPARK",
  521. "INDIREKTE FRISPARK",
  522. "STRAFFESPARK",
  523. "CORNER",
  524. "INNKAST",
  525. "UTSPILL FRA M>L",
  526. "AVSPARK",
  527. "OFFSIDE",
  528. "SKADD SPILLER: ",
  529. "FULL TID",
  530. "OVERTID",
  531. "HALVTID",
  532. "STRAFFEKONKURRANSE",
  533. "SLUTTRESULTAT ETTER STRAFFER",
  534. "SELVM>L VED: ",
  535. "REPRISE",
  536. "INNBYTTE",
  537. "FORMASJON",
  538. "AVBRYT",
  539. "VELG",
  540. "AV",
  541. "INNBYTTER",
  542. "P>",
  543. "FERDIG",
  544. "VALG",
  545. "DOMMER : ",
  546. },
  547. };
  548. // Stadia objects
  549. #define MAX_STAD_PTS 400
  550. #define MAX_STAD_FACES 400
  551. obj stad1,stad2,stad3,stad4;
  552. datapt stad1_p[MAX_STAD_PTS*3],stad2_p[MAX_STAD_PTS*3],stad3_p[MAX_STAD_PTS*3],stad4_p[MAX_STAD_PTS*3];
  553. word stad1_f[MAX_STAD_FACES*6],stad2_f[MAX_STAD_FACES*6],stad3_f[MAX_STAD_FACES*6],stad4_f[MAX_STAD_FACES*6];
  554. float st_w,st_l,st_h;
  555. /********************* FUNCTION CODE ********************/
  556. /*******************/
  557. /* MATRIX ROUTINES */
  558. void matcop(mat dest,mat src)
  559. // Matrix copy
  560. {
  561. short i;
  562. floatpt *p0,*p1;
  563. p0=&dest[0][0];
  564. p1=&src[0][0];
  565. for (i=0;i<16;i++)
  566. *p0++=*p1++;
  567. }
  568. void matmul(mat m1,mat m2)
  569. // Matrix multiply
  570. {
  571. short i,j;
  572. mat res;
  573. floatpt *wr=&res[0][0];
  574. for (i=0;i<4;i++)
  575. for (j=0;j<4;j++)
  576. *wr++=m1[0][j]*m2[i][0]+
  577. m1[1][j]*m2[i][1]+
  578. m1[2][j]*m2[i][2]+
  579. m1[3][j]*m2[i][3];
  580. matcop(m1,res);
  581. }
  582. void matmultr(mat m1,mat m2)
  583. // Reversed matrix multiply.
  584. {
  585. short i,j;
  586. mat res;
  587. floatpt *wr=&res[0][0];
  588. for (i=0;i<4;i++)
  589. for (j=0;j<4;j++)
  590. *wr++=m1[0][j]*m2[0][i]+
  591. m1[1][j]*m2[1][i]+
  592. m1[2][j]*m2[2][i]+
  593. m1[3][j]*m2[3][i];
  594. matcop(m1,res);
  595. }
  596. /*********************************************/
  597. /* DRAW GROUND (SPECIALIZED TEXTURE MAPPING) */
  598. //dword grtexx[]={0x00000000,0x003fffff,0x003fffff,0x00000000};
  599. //dword grtexy[]={0x00000000,0x00000000,0x003fffff,0x003fffff};
  600. dword grtexx[]={0x00000000,0x07ffffff,0x07ffffff,0x00000000};
  601. dword grtexy[]={0x00000000,0x00000000,0x057fffff,0x057fffff};
  602. void ground(float vr,float vwy,datapt vx,datapt vy,datapt vz)
  603. {
  604. scrpt y,ys[4],ye,yd;
  605. rotpt rx[4],ry[4],rz[4],ze;
  606. float t,d,z,tx,tz,dw1,dw2,sa,sw;
  607. BYTE *scr,*scrline,*cpyline;
  608. word w,flrsel,psh,pan;
  609. static dword td[5]={0,0,0,0,0};
  610. // Find highest pt of pitch
  611. ry[0]=-st_l*rot.e.r10+st_w*rot.e.r12+rot.e.r13;
  612. rz[0]=-st_l*rot.e.r20+st_w*rot.e.r22+rot.e.r23;
  613. ry[1]=(1280+st_l)*rot.e.r10+st_w*rot.e.r12+rot.e.r13;
  614. rz[1]=(1280+st_l)*rot.e.r20+st_w*rot.e.r22+rot.e.r23;
  615. ry[2]=(1280+st_l)*rot.e.r10-(800+st_w)*rot.e.r12+rot.e.r13;
  616. rz[2]=(1280+st_l)*rot.e.r20-(800+st_w)*rot.e.r22+rot.e.r23;
  617. ry[3]=-st_l*rot.e.r10-(800+st_w)*rot.e.r12+rot.e.r13;
  618. rz[3]=-st_l*rot.e.r20-(800+st_w)*rot.e.r22+rot.e.r23;
  619. if (scrmode3DB>=0)
  620. {
  621. rx[0]=-st_l*rot.e.r00+st_w*rot.e.r02+rot.e.r03;
  622. rx[1]=(1280+st_l)*rot.e.r00+st_w*rot.e.r02+rot.e.r03;
  623. rx[2]=(1280+st_l)*rot.e.r00-(800+st_w)*rot.e.r02+rot.e.r03;
  624. rx[3]=-st_l*rot.e.r00-(800+st_w)*rot.e.r02+rot.e.r03;
  625. CGL_VERTEX2D_ST *pts3d;
  626. CGL_TEXTURE3D_ST *tex3d;
  627. word np,p,pt,pl;
  628. short i,j,k;
  629. float fc,fc2;
  630. float tpts1[24];
  631. float tpts2[24];
  632. float ttex1[24];
  633. float ttex2[24];
  634. dword *polytexx,*polytexy;
  635. np=4;
  636. pt=0;
  637. for (j=0;j<np;j++)
  638. {
  639. k=j+1;
  640. if (k==np) k=0;
  641. if (rz[j]>=SCREENDIST)
  642. if (rz[k]>=SCREENDIST)
  643. {
  644. tpts2[pt]=rx[k];
  645. ttex2[pt++]=grtexx[k];
  646. tpts2[pt]=ry[k];
  647. ttex2[pt++]=grtexy[k];
  648. tpts2[pt++]=rz[k];
  649. }
  650. else
  651. {
  652. fc=(float)(rz[j]-SCREENDIST)/(rz[j]-rz[k]);
  653. tpts2[pt]=rx[j]+(fc*(rx[k]-rx[j]));
  654. ttex2[pt++]=grtexx[j]+(fc*(grtexx[k]-grtexx[j]));
  655. tpts2[pt]=ry[j]+(fc*(ry[k]-ry[j]));
  656. ttex2[pt++]=grtexy[j]+(fc*(grtexy[k]-grtexy[j]));
  657. tpts2[pt++]=SCREENDIST;
  658. }
  659. else
  660. if (rz[k]>=SCREENDIST)
  661. {
  662. fc=(float)(rz[k]-SCREENDIST)/(rz[k]-rz[j]);
  663. tpts2[pt]=rx[k]+(fc*(rx[j]-rx[k]));
  664. ttex2[pt++]=grtexx[k]+(fc*(grtexx[j]-grtexx[k]));
  665. tpts2[pt]=ry[k]+(fc*(ry[j]-ry[k]));
  666. ttex2[pt++]=grtexy[k]+(fc*(grtexy[j]-grtexy[k]));
  667. tpts2[pt++]=SCREENDIST;
  668. tpts2[pt]=rx[k];
  669. ttex2[pt++]=grtexx[k];
  670. tpts2[pt]=ry[k];
  671. ttex2[pt++]=grtexy[k];
  672. tpts2[pt++]=rz[k];
  673. }
  674. }
  675. for (j=0;j<pt;j+=3)
  676. {
  677. tpts2[j]=q*tpts2[j]/tpts2[j+2]+render_buff.clip_xmid;
  678. tpts2[j+1]=q*tpts2[j+1]/tpts2[j+2]+render_buff.clip_ymid;
  679. }
  680. SetPerspTextureQuadOutput3DB(texaddr3DB[0]);
  681. pts3d=&Vertex[0];
  682. tex3d=(CGL_TEXTURE3D_ST *)&Texture[0];
  683. p=0;
  684. for (j=0;j<pt;j+=3)
  685. {
  686. k=j+3;
  687. if (k==pt) k=0;
  688. if (tpts2[j]>=0)
  689. if (tpts2[k]>=0)
  690. {
  691. tpts1[p]=tpts2[k];
  692. ttex1[p++]=ttex2[k];
  693. tpts1[p]=tpts2[k+1];
  694. ttex1[p++]=ttex2[k+1];
  695. tpts1[p++]=tpts2[k+2];
  696. }
  697. else
  698. {
  699. fc=(float)tpts2[j]/(tpts2[j]-tpts2[k]);
  700. fc2=(float)tpts2[j+2]/(tpts2[k+2]*(float)-tpts2[k]/tpts2[j]+tpts2[j+2]);
  701. tpts1[p]=0;
  702. ttex1[p++]=ttex2[j]+(fc2*(ttex2[k]-ttex2[j]));
  703. tpts1[p]=tpts2[j+1]+(fc*(tpts2[k+1]-tpts2[j+1]));
  704. ttex1[p++]=ttex2[j+1]+(fc2*(ttex2[k+1]-ttex2[j+1]));
  705. tpts1[p++]=tpts2[j+2]+(fc2*(tpts2[k+2]-tpts2[j+2]));
  706. }
  707. else
  708. if (tpts2[k]>=0)
  709. {
  710. fc=(float)tpts2[k]/(tpts2[k]-tpts2[j]);
  711. fc2=(float)tpts2[k+2]/(tpts2[j+2]*(float)-tpts2[j]/tpts2[k]+tpts2[k+2]);
  712. tpts1[p]=0;
  713. ttex1[p++]=ttex2[k]+(fc2*(ttex2[j]-ttex2[k]));
  714. tpts1[p]=tpts2[k+1]+(fc*(tpts2[j+1]-tpts2[k+1]));
  715. ttex1[p++]=ttex2[k+1]+(fc2*(ttex2[j+1]-ttex2[k+1]));
  716. tpts1[p++]=tpts2[k+2]+(fc2*(tpts2[j+2]-tpts2[k+2]));
  717. tpts1[p]=tpts2[k];
  718. ttex1[p++]=ttex2[k];
  719. tpts1[p]=tpts2[k+1];
  720. ttex1[p++]=ttex2[k+1];
  721. tpts1[p++]=tpts2[k+2];
  722. }
  723. }
  724. pt=0;
  725. for (j=0;j<p;j+=3)
  726. {
  727. k=j+3;
  728. if (k==p) k=0;
  729. if (tpts1[j]<=render_buff.clip_wid)
  730. if (tpts1[k]<=render_buff.clip_wid)
  731. {
  732. tpts2[pt]=tpts1[k];
  733. ttex2[pt++]=ttex1[k];
  734. tpts2[pt]=tpts1[k+1];
  735. ttex2[pt++]=ttex1[k+1];
  736. tpts2[pt++]=tpts1[k+2];
  737. }
  738. else
  739. {
  740. fc=(float)(render_buff.clip_wid-tpts1[j])/(tpts1[k]-tpts1[j]);
  741. fc2=(float)tpts1[j+2]/(tpts1[k+2]*(float)(tpts1[k]-render_buff.clip_wid)/(render_buff.clip_wid-tpts1[j])+tpts1[j+2]);
  742. tpts2[pt]=render_buff.clip_wid;
  743. ttex2[pt++]=ttex1[j]+(fc2*(ttex1[k]-ttex1[j]));
  744. tpts2[pt]=tpts1[j+1]+(fc*(tpts1[k+1]-tpts1[j+1]));
  745. ttex2[pt++]=ttex1[j+1]+(fc2*(ttex1[k+1]-ttex1[j+1]));
  746. tpts2[pt++]=tpts1[j+2]+(fc2*(tpts1[k+2]-tpts1[j+2]));
  747. }
  748. else
  749. if (tpts1[k]<=render_buff.clip_wid)
  750. {
  751. fc=(float)(render_buff.clip_wid-tpts1[k])/(tpts1[j]-tpts1[k]);
  752. fc2=(float)tpts1[k+2]/(tpts1[j+2]*(float)(tpts1[j]-render_buff.clip_wid)/(render_buff.clip_wid-tpts1[k])+tpts1[k+2]);
  753. tpts2[pt]=render_buff.clip_wid;
  754. ttex2[pt++]=ttex1[k]+(fc2*(ttex1[j]-ttex1[k]));
  755. tpts2[pt]=tpts1[k+1]+(fc*(tpts1[j+1]-tpts1[k+1]));
  756. ttex2[pt++]=ttex1[k+1]+(fc2*(ttex1[j+1]-ttex1[k+1]));
  757. tpts2[pt++]=tpts1[k+2]+(fc2*(tpts1[j+2]-tpts1[k+2]));
  758. tpts2[pt]=tpts1[k];
  759. ttex2[pt++]=ttex1[k];
  760. tpts2[pt]=tpts1[k+1];
  761. ttex2[pt++]=ttex1[k+1];
  762. tpts2[pt++]=tpts1[k+2];
  763. }
  764. }
  765. p=0;
  766. for (j=0;j<pt;j+=3)
  767. {
  768. k=j+3;
  769. if (k==pt) k=0;
  770. if (tpts2[j+1]>=0)
  771. if (tpts2[k+1]>=0)
  772. {
  773. tpts1[p]=tpts2[k];
  774. ttex1[p++]=ttex2[k];
  775. tpts1[p]=tpts2[k+1];
  776. ttex1[p++]=ttex2[k+1];
  777. tpts1[p++]=tpts2[k+2];
  778. }
  779. else
  780. {
  781. fc=(float)tpts2[j+1]/(tpts2[j+1]-tpts2[k+1]);
  782. fc2=(float)tpts2[j+2]/(tpts2[k+2]*(float)-tpts2[k+1]/tpts2[j+1]+tpts2[j+2]);
  783. tpts1[p]=tpts2[j]+(fc*(tpts2[k]-tpts2[j]));
  784. ttex1[p++]=ttex2[j]+(fc2*(ttex2[k]-ttex2[j]));
  785. tpts1[p]=0;
  786. ttex1[p++]=ttex2[j+1]+(fc2*(ttex2[k+1]-ttex2[j+1]));
  787. tpts1[p++]=tpts2[j+2]+(fc2*(tpts2[k+2]-tpts2[j+2]));
  788. }
  789. else
  790. if (tpts2[k+1]>=0)
  791. {
  792. fc=(float)tpts2[k+1]/(tpts2[k+1]-tpts2[j+1]);
  793. fc2=(float)tpts2[k+2]/(tpts2[j+2]*(float)-tpts2[j+1]/tpts2[k+1]+tpts2[k+2]);
  794. tpts1[p]=tpts2[k]+(fc*(tpts2[j]-tpts2[k]));
  795. ttex1[p++]=ttex2[k]+(fc2*(ttex2[j]-ttex2[k]));
  796. tpts1[p]=0;
  797. ttex1[p++]=ttex2[k+1]+(fc2*(ttex2[j+1]-ttex2[k+1]));
  798. tpts1[p++]=tpts2[k+2]+(fc2*(tpts2[j+2]-tpts2[k+2]));
  799. tpts1[p]=tpts2[k];
  800. ttex1[p++]=ttex2[k];
  801. tpts1[p]=tpts2[k+1];
  802. ttex1[p++]=ttex2[k+1];
  803. tpts1[p++]=tpts2[k+2];
  804. }
  805. }
  806. pt=0;
  807. for (j=0;j<p;j+=3)
  808. {
  809. k=j+3;
  810. if (k==p) k=0;
  811. if (tpts1[j+1]<=render_buff.clip_hgtl)
  812. if (tpts1[k+1]<=render_buff.clip_hgtl)
  813. {
  814. pts3d[pt].x=(int)tpts1[k]<<16;
  815. tex3d[pt].s=ttex1[k];
  816. pts3d[pt].y=(int)tpts1[k+1]<<16;
  817. tex3d[pt].t=ttex1[k+1];
  818. tex3d[pt++].q=tpts1[k+2];
  819. }
  820. else
  821. {
  822. fc=(float)(render_buff.clip_hgtl-tpts1[j+1])/(tpts1[k+1]-tpts1[j+1]);
  823. fc2=(float)tpts1[j+2]/(tpts1[k+2]*(float)(tpts1[k+1]-render_buff.clip_hgt)/(render_buff.clip_hgt-tpts1[j+1])+tpts1[j+2]);
  824. pts3d[pt].x=(int)(tpts1[j]+(fc*(tpts1[k]-tpts1[j])))<<16;
  825. tex3d[pt].s=ttex1[j]+(int)(fc2*(ttex1[k]-ttex1[j]));
  826. pts3d[pt].y=render_buff.clip_hgtl<<16;
  827. tex3d[pt].t=ttex1[j+1]+(int)(fc2*(ttex1[k+1]-ttex1[j+1]));
  828. tex3d[pt++].q=tpts1[j+2]+(int)(fc2*(tpts1[k+2]-tpts1[j+2]));
  829. }
  830. else
  831. if (tpts1[k+1]<=render_buff.clip_hgtl)
  832. {
  833. fc=(float)(render_buff.clip_hgtl-tpts1[k+1])/(tpts1[j+1]-tpts1[k+1]);
  834. fc2=tpts1[k+2]/(tpts1[j+2]*(float)(tpts1[j+1]-render_buff.clip_hgt)/(render_buff.clip_hgt-tpts1[k+1])+tpts1[k+2]);
  835. pts3d[pt].x=(int)(tpts1[k]+(fc*(tpts1[j]-tpts1[k])))<<16;
  836. tex3d[pt].s=ttex1[k]+(int)(fc2*(ttex1[j]-ttex1[k]));
  837. pts3d[pt].y=render_buff.clip_hgtl<<16;
  838. tex3d[pt].t=ttex1[k+1]+(int)(fc2*(ttex1[j+1]-ttex1[k+1]));
  839. tex3d[pt++].q=tpts1[k+2]+(int)(fc2*(tpts1[j+2]-tpts1[k+2]));
  840. pts3d[pt].x=(int)tpts1[k]<<16;
  841. tex3d[pt].s=ttex1[k];
  842. pts3d[pt].y=(int)tpts1[k+1]<<16;
  843. tex3d[pt].t=ttex1[k+1];
  844. tex3d[pt++].q=tpts1[k+2];
  845. }
  846. }
  847. p=0;
  848. pl=pt;
  849. while (pl>4)
  850. {
  851. p+=4;
  852. pt+=2;
  853. pl-=2;
  854. for (j=pt-1;j>p;j--)
  855. {
  856. pts3d[j].x=pts3d[j-2].x;
  857. pts3d[j].y=pts3d[j-2].y;
  858. tex3d[j].s=tex3d[j-2].s;
  859. tex3d[j].t=tex3d[j-2].t;
  860. tex3d[j].q=tex3d[j-2].q;
  861. }
  862. pts3d[p].x=pts3d[0].x;
  863. pts3d[p].y=pts3d[0].y;
  864. tex3d[p].s=tex3d[0].s;
  865. tex3d[p].t=tex3d[0].t;
  866. tex3d[p].q=tex3d[0].q;
  867. }
  868. p+=pl;
  869. if (pl==3)
  870. {
  871. pts3d[p].x=pts3d[0].x;
  872. pts3d[p].y=pts3d[0].y;
  873. tex3d[p].s=tex3d[0].s;
  874. tex3d[p].t=tex3d[0].t;
  875. tex3d[p].q=tex3d[0].q;
  876. p++;
  877. }
  878. int mz;
  879. float tq;
  880. for (k=0;k<p;k+=4)
  881. {
  882. mz=tex3d[k].q;
  883. for (j=1;j<4;j++)
  884. if (tex3d[k+j].q<mz) mz=tex3d[k+j].q;
  885. for (j=0;j<4;j++)
  886. {
  887. tq=(float)mz/tex3d[k+j].q;
  888. tex3d[k+j].s*=tq;
  889. tex3d[k+j].t*=tq;
  890. tex3d[k+j].q=tq*65536;
  891. }
  892. }
  893. pts3d+=p;
  894. tex3d+=p;
  895. if ((p=pts3d-Vertex)>0)
  896. {
  897. SetPerspTextureQuadOutput3DB(pitchaddr3DB);
  898. Render3DB(p);
  899. }
  900. // Find lowest pt of sky
  901. #define ST_DP 200
  902. ry[0]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  903. rz[0]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  904. ry[1]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  905. rz[1]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  906. ry[2]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  907. rz[2]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  908. ry[3]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  909. rz[3]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  910. if (rz[0]>0)
  911. ye=q*ry[0]/rz[0],ze=rz[0];
  912. else
  913. ye=render_buff.clip_ymid,ze=0;
  914. if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  915. if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  916. if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  917. if (ye<=-render_buff.clip_ymid) ye=-render_buff.clip_ymid+1;
  918. if (ye<render_buff.clip_ymid)
  919. {
  920. SetRectangleOutput3DBx(skyaddr3DB);
  921. Vertex[0].x=render_buff.clip_widl<<16;
  922. Vertex[0].y=render_buff.clip_hgt<<16;
  923. Vertex[1].x=0;
  924. Vertex[1].y=(ye+render_buff.clip_ymid)<<16;
  925. sa=atan(512/(q*512/(640*((render_buff.scale_x+render_buff.scale_y)/2))));
  926. if (sth<0)
  927. {
  928. Texture[0].s=((int)(512*acos((double)cth)/sa)%512)<<16;
  929. Texture[1].s=(511+((int)(512*acos((double)cth)/sa)%512))<<16;
  930. }
  931. else
  932. {
  933. Texture[0].s=-((int)(512*acos((double)cth)/sa)%512)<<16;
  934. Texture[1].s=(511-((int)(512*acos((double)cth)/sa)%512))<<16;
  935. }
  936. Texture[0].t=((256*(ye+render_buff.clip_ymid))/render_buff.clip_hgt)<<16;
  937. Texture[1].t=255<<16;
  938. Render3DB(2);
  939. }
  940. return;
  941. }
  942. if (setup.detail.pitch)
  943. {
  944. if (rz[0]>0)
  945. ye=q*ry[0]/rz[0],ze=rz[0];
  946. else
  947. ye=-render_buff.clip_ymid,ze=0;
  948. if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  949. if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  950. if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  951. if (ye>render_buff.clip_ymid) ye=render_buff.clip_ymid;
  952. scrline=render_buff.clip_end+render_buff.clip_wid;
  953. y=-render_buff.clip_ymid;
  954. t=q*sph+y*cph; // Repeated divisor & incrementor
  955. while (t<0 && y<ye)
  956. {
  957. d=vy/t; // Depth (unscaled)
  958. z=d*(q*cph-y*sph); // Floor depth
  959. tx=vx-z*sth; // X pos of pt
  960. tz=-vz-z*cth; // Z pos of pt
  961. dw2=-d*sth;
  962. dw1=d*cth;
  963. if (setup.detail.pitch==1)
  964. {
  965. psh=15;
  966. pan=0x1f1f;
  967. flrsel=mapsel[mappages+noloop];
  968. }
  969. else
  970. {
  971. psh=16;
  972. pan=0x3f3f;
  973. flrsel=mapsel[mappages+noloop+1];
  974. }
  975. td[1]=(dword)((tz-dw2*render_buff.clip_xmid)*(1<<psh));
  976. td[2]=(dword)((tx-dw1*render_buff.clip_xmid)*(1<<psh));
  977. td[3]=(dword)(dw2*(1<<psh))&0xffffff;
  978. td[4]=(dword)(dw1*(1<<psh))&0xffffff;
  979. y++;
  980. t+=cph;
  981. scr=scrline;
  982. w=render_buff.clip_wid;
  983. //Assembly burst for pitch scan line
  984. extern void hlinp1(void);
  985. #pragma aux hlinp1=\
  986. ".486"\
  987. "push ebp"\
  988. "push ds"\
  989. "mov esi,td[2]"\
  990. "mov si,pan"\
  991. "mov edx,td[10]"\
  992. "mov bx,word ptr td[18]"\
  993. "mov ecx,td[14]"\
  994. "mov ch,bl"\
  995. "and cx,si"\
  996. "mov ebx,td[6]"\
  997. "mov bh,dl"\
  998. "mov dx,0"\
  999. "mov di,w"\
  1000. "mov ax,flrsel"\
  1001. "mov ds,ax"\
  1002. "mov ebp,scr";
  1003. extern void hlinp2(void);
  1004. #pragma aux hlinp2=\
  1005. "lpp:"\
  1006. "and bx,si"\
  1007. "mov al,[bx]"\
  1008. "add esi,edx"\
  1009. "adc ebx,ecx"\
  1010. "adc bh,dh"\
  1011. "and bx,si"\
  1012. "mov ah,[bx]"\
  1013. "add esi,edx"\
  1014. "adc ebx,ecx"\
  1015. "adc bh,dh"\
  1016. "and bx,si"\
  1017. "bswap eax"\
  1018. "mov ah,[bx]"\
  1019. "add esi,edx"\
  1020. "adc ebx,ecx"\
  1021. "adc bh,dh"\
  1022. "and bx,si"\
  1023. "mov al,[bx]"\
  1024. "add esi,edx"\
  1025. "adc ebx,ecx"\
  1026. "adc bh,dh"\
  1027. "mov -4[ebp],eax"\
  1028. "and bx,si"\
  1029. "mov al,[bx]"\
  1030. "add esi,edx"\
  1031. "adc ebx,ecx"\
  1032. "adc bh,dh"\
  1033. "and bx,si"\
  1034. "mov ah,[bx]"\
  1035. "add esi,edx"\
  1036. "adc ebx,ecx"\
  1037. "adc bh,dh"\
  1038. "and bx,si"\
  1039. "bswap eax"\
  1040. "mov ah,[bx]"\
  1041. "add esi,edx"\
  1042. "adc ebx,ecx"\
  1043. "adc bh,dh"\
  1044. "and bx,si"\
  1045. "mov al,[bx]"\
  1046. "add esi,edx"\
  1047. "adc ebx,ecx"\
  1048. "adc bh,dh"\
  1049. "sub ebp,8"\
  1050. "mov [ebp],eax"\
  1051. "sub di,8"\
  1052. "jne short lpp"\
  1053. "pop ds"\
  1054. "pop ebp"\
  1055. modify [eax ebx ecx edx esi edi];
  1056. hlinp1();
  1057. hlinp2();
  1058. scrline-=render_buff.buff_wid;
  1059. }
  1060. }
  1061. // Find lowest pt of sky
  1062. #define ST_DP 200
  1063. ry[0]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1064. rz[0]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1065. ry[1]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11+(st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1066. rz[1]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21+(st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1067. ry[2]=(1280+st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1068. rz[2]=(1280+st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1069. ry[3]=-(st_l+ST_DP)*rot.e.r10+st_h*rot.e.r11-(800+st_w+ST_DP)*rot.e.r12+rot.e.r13;
  1070. rz[3]=-(st_l+ST_DP)*rot.e.r20+st_h*rot.e.r21-(800+st_w+ST_DP)*rot.e.r22+rot.e.r23;
  1071. if (rz[0]>0)
  1072. ye=q*ry[0]/rz[0],ze=rz[0];
  1073. else
  1074. ye=render_buff.clip_ymid,ze=0;
  1075. if (rz[1]>ze) ye=q*ry[1]/rz[1],ze=rz[1];
  1076. if (rz[2]>ze) ye=q*ry[2]/rz[2],ze=rz[2];
  1077. if (rz[3]>ze) ye=q*ry[3]/rz[3],ze=rz[3];
  1078. if (ye<-render_buff.clip_ymid) ye=-render_buff.clip_ymid;
  1079. #define PI 3.1415
  1080. sa=atan((double)render_buff.clip_wid/q);
  1081. sw=3;//(int)(0.5+2*PI/sa);
  1082. sa=2*PI/sw;
  1083. if (setup.M8&&setup.detail.sky)
  1084. {
  1085. if ((yd=ye+q*sph/cph)<0) yd=0;
  1086. if (479-yd<240-ye) yd=240+ye;
  1087. if (sth<0)
  1088. cpyline=sky+640*(480-yd)-(int)(640*acos((double)cth)/sa)%640;
  1089. else
  1090. cpyline=sky+640*(479-yd)+(int)(640*acos((double)cth)/sa)%640;
  1091. y=render_buff.clip_ymid-ye-1;
  1092. scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1093. while (y-->=0)
  1094. {
  1095. memcpy(scrline,cpyline,render_buff.clip_wid);
  1096. scrline-=render_buff.buff_wid;
  1097. cpyline-=640;
  1098. }
  1099. }
  1100. else
  1101. {
  1102. #if 0
  1103. if ((yd=ye+q*sph/cph)<0) yd=0;
  1104. if (199-yd<100-ye) yd=100+ye;
  1105. if (sth<0)
  1106. cpyline=sky+320*(200-yd)-(int)(render_buff.clip_wid*acos((double)cth)/sa)%320;
  1107. else
  1108. cpyline=sky+320*(199-yd)+(int)(render_buff.clip_wid*acos((double)cth)/sa)%320;
  1109. y=render_buff.clip_ymid-ye-1;
  1110. scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1111. while (y-->=0)
  1112. {
  1113. memcpy(scrline,cpyline,render_buff.clip_wid);
  1114. cpyline-=320;
  1115. scrline-=render_buff.buff_wid;
  1116. }
  1117. #else
  1118. y=render_buff.clip_ymid-ye-1;
  1119. scrline=render_buff.buff_start+y*render_buff.buff_wid;
  1120. while (y-->=0)
  1121. {
  1122. memset(scrline,204,render_buff.clip_wid);
  1123. scrline-=render_buff.buff_wid;
  1124. }
  1125. #endif
  1126. }
  1127. }
  1128. /******************************/
  1129. /* GET OBJECT DEPTH STRUCTURE */
  1130. // Macro for objects with no detail levels
  1131. #define objdep(ob) ((ob).x*rot.e.r20+(ob).y*rot.e.r21+(ob).z*rot.e.r22+rot.e.r23)
  1132. // Routine for objects with detail levels
  1133. float objdepd(obj *ob, det *detail)
  1134. {
  1135. rotpt oz,zq;
  1136. if ((oz=ob->x*rot.e.r20+ob->y*rot.e.r21+ob->z*rot.e.r22+rot.e.r23)<0)
  1137. zq=0;
  1138. else
  1139. zq=oz/q;
  1140. while (detail->zscale>zq) detail++;
  1141. ob->points=detail->dpoints;
  1142. ob->faces=detail->dfaces;
  1143. return oz;
  1144. }
  1145. /*************************************/
  1146. /* ADD ROTATED FACES TO POLYGON LIST */
  1147. // Add ordinary polygon to list
  1148. void
  1149. addpoly(face obf,word np,word col)
  1150. {
  1151. word p;
  1152. rotpt dx1,dy1,dx2,dy2,tz1,tz2;
  1153. rpt tpt1,tpt2,tpt3;
  1154. // Unroll first three face points in subsequent code
  1155. tpt1=&rotlist[obf[0]<<2];
  1156. tpt2=&rotlist[obf[1]<<2];
  1157. tpt3=&rotlist[obf[2]<<2];
  1158. // Find min z
  1159. tz2=tpt1[0];
  1160. if (tpt2[0]<tz2) tz2=tpt2[0];
  1161. if (tpt3[0]<tz2) tz2=tpt3[0];
  1162. for (p=3;p<np;p++)
  1163. if ((tz1=rotlist[obf[p]<<2])<tz2) tz2=tz1;
  1164. // If visible...
  1165. if (tz2>=CUTOFFDIST)
  1166. {
  1167. // Facing check
  1168. dx1=dx2=tpt1[1];
  1169. dy1=dy2=tpt1[2];
  1170. dx1-=tpt2[1];
  1171. dy1-=tpt2[2];
  1172. dx2-=tpt3[1];
  1173. dy2-=tpt3[2];
  1174. if (dx1*dy2<dx2*dy1)
  1175. {
  1176. // Transfer rotated points to polygon list
  1177. // and calculate average z
  1178. curpol->pts=curpts;
  1179. curpts[0]=np;
  1180. curpts[1]=col;
  1181. /*
  1182. if (col>=256)
  1183. {
  1184. tz1=tpt1[0];
  1185. curpts[2]=max(tz1,CUTOFFDIST);
  1186. curpts[3]=tpt1[1];
  1187. curpts[4]=tpt1[2];
  1188. tz1+=tpt2[0];
  1189. curpts[5]=max(tpt2[0],CUTOFFDIST);
  1190. curpts[6]=tpt2[1];
  1191. curpts[7]=tpt2[2];
  1192. tz1+=tpt3[0];
  1193. curpts[8]=max(tpt3[0],CUTOFFDIST);
  1194. curpts[9]=tpt3[1];
  1195. curpts[10]=tpt3[2];
  1196. curpts+=11;
  1197. for (p=3;p<np;p++)
  1198. {
  1199. tpt1=&rotlist[obf[p]<<2];
  1200. tz1+=tpt1[0];
  1201. curpts[0]=max(tpt1[0],CUTOFFDIST);
  1202. curpts[1]=tpt1[1];
  1203. curpts[2]=tpt1[2];
  1204. curpts+=3;
  1205. }
  1206. }
  1207. else
  1208. {
  1209. }
  1210. */
  1211. tz1=tpt1[0];
  1212. curpts[2]=tpt1[1];
  1213. curpts[3]=tpt1[2];
  1214. tz1+=tpt2[0];
  1215. curpts[4]=tpt2[1];
  1216. curpts[5]=tpt2[2];
  1217. tz1+=tpt3[0];
  1218. curpts[6]=tpt3[1];
  1219. curpts[7]=tpt3[2];
  1220. curpts+=8;
  1221. for (p=3;p<np;p++)
  1222. {
  1223. tpt1=&rotlist[obf[p]<<2];
  1224. tz1+=tpt1[0];
  1225. curpts[0]=tpt1[1];
  1226. curpts[1]=tpt1[2];
  1227. curpts+=2;
  1228. }
  1229. curpol->z=tz1/np;
  1230. curpol++;
  1231. }
  1232. }
  1233. }
  1234. // Add line to list
  1235. void
  1236. addline(face obf,word col)
  1237. {
  1238. rotpt tz;
  1239. rpt tpt1,tpt2;
  1240. // Find min z
  1241. tpt1=&rotlist[obf[0]<<2];
  1242. tpt2=&rotlist[obf[1]<<2];
  1243. tz=min(tpt1[0],tpt2[0]);
  1244. // If visible...
  1245. if (tz>=CUTOFFDIST)
  1246. {
  1247. // Transfer rotated line points to polygon
  1248. // list and calculate average z
  1249. curpol->pts=curpts;
  1250. curpol->z=(tpt1[0]+tpt2[0])/2;
  1251. curpts[0]=2;
  1252. curpts[1]=col;
  1253. curpts[2]=tpt1[1];
  1254. curpts[3]=tpt1[2];
  1255. curpts[4]=tpt2[1];
  1256. curpts[5]=tpt2[2];
  1257. curpts+=6;
  1258. curpol++;
  1259. }
  1260. }
  1261. // Add 3d cylinder map to list
  1262. void
  1263. add3dcmap(face obf,word col)
  1264. {
  1265. rotpt dx1,dy1,dx2,dy2,tz1,tz2;
  1266. rpt tpt1,tpt2,tpt3;
  1267. // Find min z
  1268. tpt1=&rotlist[obf[0]<<2];
  1269. tpt2=&rotlist[obf[1]<<2];
  1270. tz1=min(tpt1[0],tpt2[0]);
  1271. // If visible...
  1272. if (tz1>=CUTOFFDIST)
  1273. {
  1274. curpts[0]=4;
  1275. curpol->pts=curpts;
  1276. curpol->z=(tpt1[0]+tpt2[0])/2;
  1277. // Calculate bounding rectangle for cylinder texture map
  1278. /*
  1279. tpt1[0]=0;
  1280. tpt1[1]=0;
  1281. tpt1[2]=0;
  1282. tpt2[0]=0;
  1283. tpt2[1]=0;
  1284. tpt2[2]=0;
  1285. obf[2]=0;
  1286. obf[3]=0;
  1287. */
  1288. dx1=tpt1[1]-tpt2[1];
  1289. dy1=tpt1[2]-tpt2[2];
  1290. if ((dx2=dx1*dx1+dy1*dy1)==0) dx1=dx2=1;
  1291. tz2=obf[2]*qa/(sqrt(dx2)*(tpt1[0]+tpt2[0]));
  1292. tz1=100*(tpt2[0]-tpt1[0])/obf[3];
  1293. if (tz1>=0)
  1294. {
  1295. if (tz1>0.78062475)
  1296. if (tz1>0.92702481) col-=3;
  1297. else col-=2;
  1298. else
  1299. if (tz1>0.48412292) col--;
  1300. // if (tz1>0.78062475)
  1301. // if (tz1>0.92702481) col-=3;
  1302. // else col-=2;
  1303. // else
  1304. // if (tz1>0.48412292) col--;
  1305. // col-=(int)((1-sqrt(1-tz1*tz1))*4.3);
  1306. tz1*=tz2;
  1307. dy2=tz2*dy1;
  1308. dx2=tz2*dx1;
  1309. dy1*=tz1;
  1310. dx1*=tz1;
  1311. curpts[1]=col;
  1312. curpts[2]=tpt1[1]+dx1-dy2;
  1313. curpts[3]=tpt1[2]+dy1+dx2;
  1314. curpts[4]=tpt1[1]+dx1+dy2;
  1315. curpts[5]=tpt1[2]+dy1-dx2;
  1316. curpts[6]=tpt2[1]-dx1+dy2;
  1317. curpts[7]=tpt2[2]-dy1-dx2;
  1318. curpts[8]=tpt2[1]-dx1-dy2;
  1319. curpts[9]=tpt2[2]-dy1+dx2;
  1320. }
  1321. else
  1322. {
  1323. if (tz1<-0.78062475)
  1324. if (tz1<-0.92702481) col+=3;
  1325. else col+=2;
  1326. else
  1327. if (tz1<-0.48412292) col++;
  1328. // col+=(int)((1-sqrt(1-tz1*tz1))*4.3);
  1329. tz1*=tz2;
  1330. dy2=tz2*dy1;
  1331. dx2=tz2*dx1;
  1332. dy1*=tz1;
  1333. dx1*=tz1;
  1334. curpts[1]=col;
  1335. curpts[2]=tpt1[1]-dx1-dy2;
  1336. curpts[3]=tpt1[2]-dy1+dx2;
  1337. curpts[4]=tpt1[1]-dx1+dy2;
  1338. curpts[5]=tpt1[2]-dy1-dx2;
  1339. curpts[6]=tpt2[1]+dx1+dy2;
  1340. curpts[7]=tpt2[2]+dy1-dx2;
  1341. curpts[8]=tpt2[1]+dx1-dy2;
  1342. curpts[9]=tpt2[2]+dy1+dx2;
  1343. }
  1344. curpts+=10;
  1345. curpol++;
  1346. }
  1347. }
  1348. // Add 3d eliptical cylinder map to list
  1349. void
  1350. add3demap(face obf,word col)
  1351. {
  1352. rotpt dx1,dy1,dx2,dy2,tz1,tz2,rx,ry,rz;
  1353. rpt tpt1,tpt2,tpt3;
  1354. // Find min z
  1355. tpt1=&rotlist[obf[0]<<2];
  1356. tpt2=&rotlist[obf[1]<<2];
  1357. tz1=min(tpt1[0],tpt2[0]);
  1358. // If visible...
  1359. if (tz1>=CUTOFFDIST)
  1360. {
  1361. curpts[0]=4;
  1362. curpol->pts=curpts;
  1363. curpol->z=(tpt1[0]+tpt2[0])/2;
  1364. // Calculate bounding rectangle for elliptical cylinder texture map
  1365. // tpt3=&rotlist[obf[2]<<2];
  1366. // dx1=tpt1[1]-tpt2[1];
  1367. // dy1=tpt1[2]-tpt2[2];
  1368. // rx=((tpt3[1]-render_buff.clip_xmid)*tpt3[0]-(tpt2[1]-render_buff.clip_xmid)*tpt2[0])/q;
  1369. // ry=((tpt3[2]-render_buff.clip_ymid)*tpt3[0]-(tpt2[2]-render_buff.clip_ymid)*tpt2[0])/q;
  1370. // if ((dx2=dx1*dx1+dy1*dy1)<2) return;
  1371. // dx2=sqrt(dx2);
  1372. // dy2=100*(tpt1[0]-tpt2[0])/obf[5];
  1373. // tz1=(rx*dy1-ry*dx1)/dx2;
  1374. // tz2=qa/(dx2*(tpt1[0]+tpt2[0]));
  1375. tpt3=&rotlist[obf[2]<<2];
  1376. dx1=tpt1[1]-tpt2[1];
  1377. dy1=tpt1[2]-tpt2[2];
  1378. rx=(tpt3[1]-tpt2[1])*tpt3[0]/q;
  1379. ry=(tpt3[2]-tpt2[2])*tpt3[0]/q;
  1380. if ((dx2=dx1*dx1+dy1*dy1)==0) dx1=dx2=1;
  1381. dy2=sqrt(dx2);
  1382. tz2=qa/(dy2*(tpt1[0]+tpt2[0]));
  1383. tz1=(rx*dy1-ry*dx1)/dy2;
  1384. if (tz1<-1) tz1=-1;
  1385. if (tz1>1) tz1=1;
  1386. if (tpt3[0]>tpt2[0])
  1387. // if (rx*dx1<ry*dy1)
  1388. if (tz1>-.2588)
  1389. if (tz1<=.7071)
  1390. if (tz1<=.2588)
  1391. col-=9;
  1392. else
  1393. col-=10;
  1394. else
  1395. {
  1396. if (tz1<=.9659)
  1397. col-=11;
  1398. }
  1399. else
  1400. if (tz1>-.7071)
  1401. col-=8;
  1402. else
  1403. if (tz1>-.9659)
  1404. col-=7;
  1405. else
  1406. col-=6;
  1407. else
  1408. if (tz1<=.2588)
  1409. if (tz1>-.7071)
  1410. if (tz1>-.2588)
  1411. col-=3;
  1412. else
  1413. col-=4;
  1414. else
  1415. if (tz1>-.9659)
  1416. col-=5;
  1417. else
  1418. col-=6;
  1419. else
  1420. if (tz1<=.7071)
  1421. col-=2;
  1422. else
  1423. if (tz1<=.9659)
  1424. col-=1;
  1425. // tz1*=tz1;
  1426. // tz1*=(obf[3]-obf[4])*(obf[3]+obf[4]);
  1427. // dx2=tz2*sqrt(tz1+obf[4]*obf[4]);
  1428. tz1*=tz1;
  1429. tz1*=(obf[3]-obf[4])*(obf[3]+obf[4]);
  1430. dx2=tz2*sqrt(tz1+obf[4]*obf[4]);
  1431. dy2=100*(tpt1[0]-tpt2[0])/obf[5];
  1432. if (dy2>=0)
  1433. {
  1434. if (dy2>0.555570233)
  1435. if (dy2>0.836286155) col-=36;
  1436. else col-=24;
  1437. else
  1438. if (dy2>0.195090322) col-=12;
  1439. dy2*=tz2*sqrt(obf[3]*obf[3]-tz1);
  1440. tz1=dy2*dx1;
  1441. tz2=dy2*dy1;
  1442. dx1*=dx2;
  1443. dy1*=dx2;
  1444. curpts[1]=col;
  1445. curpts[2]=tpt2[1]+dy1-tz1;
  1446. curpts[3]=tpt2[2]-dx1-tz2;
  1447. curpts[4]=tpt2[1]-dy1-tz1;
  1448. curpts[5]=tpt2[2]+dx1-tz2;
  1449. curpts[6]=tpt1[1]-dy1+tz1;
  1450. curpts[7]=tpt1[2]+dx1+tz2;
  1451. curpts[8]=tpt1[1]+dy1+tz1;
  1452. curpts[9]=tpt1[2]-dx1+tz2;
  1453. }
  1454. else
  1455. {
  1456. if (dy2<-0.258819045)
  1457. if (dy2<-0.707106781) col+=12;
  1458. else col+=12;
  1459. dy2*=tz2*sqrt(obf[3]*obf[3]-tz1);
  1460. tz1=dy2*dx1;
  1461. tz2=dy2*dy1;
  1462. dx1*=dx2;
  1463. dy1*=dx2;
  1464. curpts[1]=col;
  1465. curpts[2]=tpt2[1]+dy1+tz1;
  1466. curpts[3]=tpt2[2]-dx1+tz2;
  1467. curpts[4]=tpt2[1]-dy1+tz1;
  1468. curpts[5]=tpt2[2]+dx1+tz2;
  1469. curpts[6]=tpt1[1]-dy1-tz1;
  1470. curpts[7]=tpt1[2]+dx1-tz2;
  1471. curpts[8]=tpt1[1]+dy1-tz1;
  1472. curpts[9]=tpt1[2]-dx1-tz2;
  1473. }
  1474. curpts+=10;
  1475. curpol++;
  1476. }
  1477. }
  1478. // Add polygon to list, with clipping, (note: optimised for unclipped objects)
  1479. void
  1480. addpolyc(face obf,word np,word col)
  1481. {
  1482. word p,pc,tp,i;
  1483. dword *texx,*texy,*texs;
  1484. rotpt dx1,dy1,dx2,dy2,tz1,tz2,qrz,qrz2;
  1485. rpt tpt1,tpt2,tpt3;
  1486. // Unroll first three face points in subsequent code
  1487. tpt1=&rotlist[obf[0]<<2];
  1488. tpt2=&rotlist[obf[1]<<2];
  1489. tpt3=&rotlist[obf[2]<<2];
  1490. // If any of first 3 pts need clipping, facing check is invalid, so go to clipping code now
  1491. if ((tz1=tpt1[0])<SCREENDIST||tpt2[0]<SCREENDIST||tpt3[0]<SCREENDIST)
  1492. {
  1493. p=0;tz1=0;
  1494. curpol->pts=curpts;
  1495. curpts[0]=np;
  1496. curpts[1]=col;
  1497. curpts+=2;
  1498. goto pclip;
  1499. }
  1500. // Facing check
  1501. dx1=dx2=tpt1[1];
  1502. dy1=dy2=tpt1[2];
  1503. dx1-=tpt2[1];
  1504. dy1-=tpt2[2];
  1505. dx2-=tpt3[1];
  1506. dy2-=tpt3[2];
  1507. if (dx1*dy2<dx2*dy1)
  1508. {
  1509. // Transfer rotated points to polygon list and
  1510. // calculate average z. Go to clipping code if necessary
  1511. curpol->pts=curpts;
  1512. curpts[0]=np;
  1513. curpts[1]=col;
  1514. curpts[2]=tpt1[1];
  1515. curpts[3]=tpt1[2];
  1516. curpts[4]=tpt2[1];
  1517. curpts[5]=tpt2[2];
  1518. tz1+=tpt2[0];
  1519. curpts[6]=tpt3[1];
  1520. curpts[7]=tpt3[2];
  1521. tz1+=tpt3[0];
  1522. curpts+=8;
  1523. for (p=3;p<np;p++)
  1524. {
  1525. tpt1=&rotlist[obf[p]<<2];
  1526. if ((tz2=tpt1[0])<SCREENDIST) goto pclip;
  1527. tz1+=tz2;
  1528. curpts[0]=tpt1[1];
  1529. curpts[1]=tpt1[2];
  1530. curpts+=2;
  1531. }
  1532. curpol->z=tz1/np;
  1533. curpol++;
  1534. }
  1535. return;
  1536. // Polygon needs clipping
  1537. pclip:;
  1538. if (col<0)
  1539. {
  1540. // Texture map...
  1541. if (col<-2000)
  1542. {
  1543. texs=(dword *)&textures[-col-2000];
  1544. col=-2000-clip_tex;
  1545. }
  1546. else
  1547. {
  1548. texs=(dword *)&textures[-col];
  1549. col=-clip_tex;
  1550. }
  1551. *(curpol->pts+1)=col;
  1552. texy=(dword *)&textures[clip_tex];
  1553. texx=(dword *)&textures[++clip_tex];
  1554. for (i=0;i<p;i++)
  1555. texy[i]=texs[i];
  1556. for (i=0;i<p;i++)
  1557. texx[i]=texs[np+i];
  1558. tp=(p+np-1)%np;
  1559. tpt2=&rotlist[obf[tp]<<2];
  1560. pc=p;
  1561. do
  1562. {
  1563. tz1+=tpt1[0];
  1564. if (tpt1[0]>=SCREENDIST)
  1565. {
  1566. if (tpt2[0]<SCREENDIST)
  1567. {
  1568. qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1569. qrz2=tpt1[0]/SCREENDIST;
  1570. curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1571. curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1572. curpts+=2;
  1573. texy[pc]=texs[tp]+qrz*(texs[p]-texs[tp]);
  1574. texx[pc]=texs[tp+np]+qrz*(texs[p+np]-texs[tp+np]);
  1575. if (++pc==3)
  1576. {
  1577. dx1=dx2=curpts[-6];
  1578. dy1=dy2=curpts[-5];
  1579. dx1-=curpts[-4];
  1580. dy1-=curpts[-3];
  1581. dx2-=curpts[-2];
  1582. dy2-=curpts[-1];
  1583. if (dx1*dy2>=dx2*dy1)
  1584. {
  1585. curpts=curpol->pts;
  1586. return;
  1587. }
  1588. }
  1589. }
  1590. curpts[0]=tpt1[1];
  1591. curpts[1]=tpt1[2];
  1592. curpts+=2;
  1593. texy[pc]=texs[p];
  1594. texx[pc]=texs[p+np];
  1595. if (++pc==3)
  1596. {
  1597. dx1=dx2=curpts[-6];
  1598. dy1=dy2=curpts[-5];
  1599. dx1-=curpts[-4];
  1600. dy1-=curpts[-3];
  1601. dx2-=curpts[-2];
  1602. dy2-=curpts[-1];
  1603. if (dx1*dy2>=dx2*dy1)
  1604. {
  1605. curpts=curpol->pts;
  1606. return;
  1607. }
  1608. }
  1609. }
  1610. else
  1611. if (tpt2[0]>=SCREENDIST)
  1612. {
  1613. qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1614. qrz2=tpt2[0]/SCREENDIST;
  1615. curpts[0]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1616. curpts[1]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1617. curpts+=2;
  1618. texy[pc]=texs[p]+qrz*(texs[tp]-texs[p]);
  1619. texx[pc]=texs[p+np]+qrz*(texs[tp+np]-texs[p+np]);
  1620. if (++pc==3)
  1621. {
  1622. dx1=dx2=curpts[-6];
  1623. dy1=dy2=curpts[-5];
  1624. dx1-=curpts[-4];
  1625. dy1-=curpts[-3];
  1626. dx2-=curpts[-2];
  1627. dy2-=curpts[-1];
  1628. if (dx1*dy2>=dx2*dy1)
  1629. {
  1630. curpts=curpol->pts;
  1631. return;
  1632. }
  1633. }
  1634. }
  1635. tpt2=tpt1;
  1636. tp=p;
  1637. tpt1=&rotlist[obf[(++p)%np]<<2];
  1638. }while (p<np);
  1639. p%=np;
  1640. if (tpt1[0]>=SCREENDIST && tpt2[0]<SCREENDIST)
  1641. {
  1642. qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1643. qrz2=tpt1[0]/SCREENDIST;
  1644. curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1645. curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1646. curpts+=2;
  1647. texy[pc]=texs[tp]+qrz*(texs[p]-texs[tp]);
  1648. texx[pc]=texs[tp+np]+qrz*(texs[p+np]-texs[tp+np]);
  1649. if (++pc==3)
  1650. {
  1651. dx1=dx2=curpts[-6];
  1652. dy1=dy2=curpts[-5];
  1653. dx1-=curpts[-4];
  1654. dy1-=curpts[-3];
  1655. dx2-=curpts[-2];
  1656. dy2-=curpts[-1];
  1657. if (dx1*dy2>=dx2*dy1)
  1658. {
  1659. curpts=curpol->pts;
  1660. return;
  1661. }
  1662. }
  1663. }
  1664. for (i=0;i<pc;i++)
  1665. texy[pc+i]=texx[i];
  1666. if (pc>4) clip_tex++;
  1667. }
  1668. else
  1669. {
  1670. tpt2=&rotlist[obf[(p+np-1)%np]<<2];
  1671. pc=p;
  1672. do
  1673. {
  1674. tz1+=tpt1[0];
  1675. if (tpt1[0]>=SCREENDIST)
  1676. {
  1677. if (tpt2[0]<SCREENDIST)
  1678. {
  1679. qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1680. qrz2=tpt1[0]/SCREENDIST;
  1681. curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1682. curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1683. curpts+=2;
  1684. if (++pc==3)
  1685. {
  1686. dx1=dx2=curpts[-6];
  1687. dy1=dy2=curpts[-5];
  1688. dx1-=curpts[-4];
  1689. dy1-=curpts[-3];
  1690. dx2-=curpts[-2];
  1691. dy2-=curpts[-1];
  1692. if (dx1*dy2>=dx2*dy1)
  1693. {
  1694. curpts=curpol->pts;
  1695. return;
  1696. }
  1697. }
  1698. }
  1699. curpts[0]=tpt1[1];
  1700. curpts[1]=tpt1[2];
  1701. curpts+=2;
  1702. if (++pc==3)
  1703. {
  1704. dx1=dx2=curpts[-6];
  1705. dy1=dy2=curpts[-5];
  1706. dx1-=curpts[-4];
  1707. dy1-=curpts[-3];
  1708. dx2-=curpts[-2];
  1709. dy2-=curpts[-1];
  1710. if (dx1*dy2>=dx2*dy1)
  1711. {
  1712. curpts=curpol->pts;
  1713. return;
  1714. }
  1715. }
  1716. }
  1717. else
  1718. if (tpt2[0]>=SCREENDIST)
  1719. {
  1720. qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1721. qrz2=tpt2[0]/SCREENDIST;
  1722. curpts[0]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1723. curpts[1]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1724. curpts+=2;
  1725. if (++pc==3)
  1726. {
  1727. dx1=dx2=curpts[-6];
  1728. dy1=dy2=curpts[-5];
  1729. dx1-=curpts[-4];
  1730. dy1-=curpts[-3];
  1731. dx2-=curpts[-2];
  1732. dy2-=curpts[-1];
  1733. if (dx1*dy2>=dx2*dy1)
  1734. {
  1735. curpts=curpol->pts;
  1736. return;
  1737. }
  1738. }
  1739. }
  1740. tpt2=tpt1;
  1741. tpt1=&rotlist[obf[(++p)%np]<<2];
  1742. }while (p<np);
  1743. if (tpt1[0]>=SCREENDIST && tpt2[0]<SCREENDIST)
  1744. {
  1745. qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1746. qrz2=tpt1[0]/SCREENDIST;
  1747. curpts[0]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1748. curpts[1]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1749. curpts+=2;
  1750. if (++pc==3)
  1751. {
  1752. dx1=dx2=curpts[-6];
  1753. dy1=dy2=curpts[-5];
  1754. dx1-=curpts[-4];
  1755. dy1-=curpts[-3];
  1756. dx2-=curpts[-2];
  1757. dy2-=curpts[-1];
  1758. if (dx1*dy2>=dx2*dy1)
  1759. {
  1760. curpts=curpol->pts;
  1761. return;
  1762. }
  1763. }
  1764. }
  1765. }
  1766. // All pts clipped?
  1767. if (pc==0)
  1768. curpts=curpol->pts;
  1769. else
  1770. {
  1771. *(curpol->pts)=pc;
  1772. curpol->z=tz1/np;
  1773. curpol++;
  1774. }
  1775. }
  1776. // Add line to list, with clipping
  1777. void
  1778. addlinec(face obf,word col)
  1779. {
  1780. rotpt qrz,qrz2;
  1781. rpt tpt1,tpt2;
  1782. // Transfer rotated (/clipped) points to polygon list
  1783. // and calculate average z
  1784. tpt1=&rotlist[obf[0]<<2];
  1785. tpt2=&rotlist[obf[1]<<2];
  1786. if (tpt1[0]<SCREENDIST)
  1787. {
  1788. if (tpt2[0]<SCREENDIST) return;
  1789. qrz=(SCREENDIST-tpt1[0])/(tpt2[0]-tpt1[0]);
  1790. qrz2=tpt2[0]/SCREENDIST;
  1791. curpts[2]=tpt1[1]+qrz*((tpt2[1]-render_buff.clip_xmid)*qrz2-tpt1[1])+render_buff.clip_xmid;
  1792. curpts[3]=tpt1[2]+qrz*((tpt2[2]-render_buff.clip_ymid)*qrz2-tpt1[2])+render_buff.clip_ymid;
  1793. }
  1794. else
  1795. {
  1796. curpts[2]=tpt1[1];
  1797. curpts[3]=tpt1[2];
  1798. }
  1799. if (tpt2[0]<SCREENDIST)
  1800. {
  1801. qrz=(SCREENDIST-tpt2[0])/(tpt1[0]-tpt2[0]);
  1802. qrz2=tpt1[0]/SCREENDIST;
  1803. curpts[4]=tpt2[1]+qrz*((tpt1[1]-render_buff.clip_xmid)*qrz2-tpt2[1])+render_buff.clip_xmid;
  1804. curpts[5]=tpt2[2]+qrz*((tpt1[2]-render_buff.clip_ymid)*qrz2-tpt2[2])+render_buff.clip_ymid;
  1805. }
  1806. else
  1807. {
  1808. curpts[4]=tpt2[1];
  1809. curpts[5]=tpt2[2];
  1810. }
  1811. curpol->pts=curpts;
  1812. curpts[0]=2;
  1813. curpts[1]=col;
  1814. curpts+=6;
  1815. curpol->z=(tpt1[0]+tpt2[0])/2;
  1816. curpol++;
  1817. }
  1818. // Add faces to polygon list, with no z clipping
  1819. void addpols(obj *ob)
  1820. {
  1821. face obf=ob->faces;
  1822. word f=*obf++;
  1823. word np,col;
  1824. #ifdef COUNT
  1825. numpols+=f;
  1826. #endif
  1827. while(f--)
  1828. {
  1829. np=obf[0];
  1830. col=obf[1];
  1831. obf+=2;
  1832. if (np>2)
  1833. {
  1834. addpoly(obf, np, col);
  1835. obf+=np;
  1836. }
  1837. else
  1838. if (np==2)
  1839. {
  1840. addline(obf, col);
  1841. obf+=2;
  1842. }
  1843. else
  1844. if (np==0)
  1845. {
  1846. add3dcmap(obf, col);
  1847. obf+=4;
  1848. }
  1849. else
  1850. {
  1851. add3demap(obf, col);
  1852. obf+=6;
  1853. }
  1854. }
  1855. }
  1856. // Add faces to polygon list, with z clipping
  1857. void addpolsc(obj *ob)
  1858. {
  1859. face obf=ob->faces;
  1860. word f=*obf++;
  1861. word np,col;
  1862. #ifdef COUNT
  1863. numpols+=f;
  1864. #endif
  1865. while(f--)
  1866. {
  1867. np=obf[0];
  1868. col=obf[1];
  1869. obf+=2;
  1870. if (np>2) // Deal with polygons...
  1871. {
  1872. addpolyc(obf,np,col);
  1873. obf+=np;
  1874. }
  1875. else
  1876. {
  1877. addlinec(obf,col);
  1878. obf+=2;
  1879. }
  1880. }
  1881. }
  1882. /******************************************/
  1883. /* ROTATE OBJECTS AND ADD TO POLYGON LIST */
  1884. // Several routines here, for various cases:
  1885. // addobjxy : objects with x & y axis rotation and no z-clipping
  1886. // addobjy : objects with y-axis rotation only and no z-clipping
  1887. // addobjyc : objects with y-axis rotation only with z-clipping
  1888. // addobjn : objects with no rotation and no z-clipping
  1889. // addobjnc : objects with no rotation with z-clipping
  1890. // addobjf : objects with no rotation, all y=0, and no z-clipping
  1891. // addobjfc : objects with no rotation, all y=0, with z-clipping
  1892. // Routine for objects with x & y axis rotation, no z-clipping
  1893. void addobjxy(obj *ob,floatpt cxrot,floatpt sxrot)
  1894. {
  1895. pt inpt=ob->points;
  1896. rpt outpt=rotlist;
  1897. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  1898. datapt x,y,z;
  1899. floatpt crot,srot;
  1900. rotpt rx,ry,rz,qrz;
  1901. // Get object depth
  1902. if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  1903. {
  1904. curobj->polys=curpol;
  1905. // Transform matrix derived from view rotation and object rotation
  1906. // Assumes r01=0 in view rotation
  1907. crot=ob->crot;
  1908. srot=ob->srot;
  1909. x=ob->x;
  1910. y=ob->y;
  1911. z=ob->z;
  1912. /*
  1913. tran.e.r00=rot.e.r00*crot-rot.e.r02*srot*cxrot; // Rotate in x then y
  1914. tran.e.r01=rot.e.r02*sxrot;
  1915. tran.e.r02=rot.e.r00*srot+rot.e.r02*crot*cxrot;
  1916. tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  1917. tran.e.r10=rot.e.r10*crot-rot.e.r11*srot*sxrot-rot.e.r12*srot*cxrot;
  1918. tran.e.r11=rot.e.r11*cxrot+rot.e.r12*sxrot;
  1919. tran.e.r12=rot.e.r10*srot-rot.e.r11*crot*sxrot+rot.e.r12*crot*cxrot;
  1920. tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  1921. tran.e.r20=rot.e.r20*crot-rot.e.r21*srot*sxrot-rot.e.r22*srot*cxrot;
  1922. tran.e.r21=rot.e.r21*cxrot+rot.e.r22*sxrot;
  1923. tran.e.r22=rot.e.r20*srot-rot.e.r21*crot*sxrot+rot.e.r22*crot*cxrot;
  1924. tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  1925. */
  1926. tran.e.r00= rot.e.r00*crot-rot.e.r02*srot; // Rotate in y then x
  1927. tran.e.r01=-rot.e.r00*srot*sxrot-rot.e.r02*crot*sxrot;
  1928. tran.e.r02= rot.e.r00*srot*cxrot+rot.e.r02*crot*cxrot;
  1929. tran.e.r03= rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  1930. tran.e.r10= rot.e.r10*crot-rot.e.r12*srot;
  1931. tran.e.r11=-rot.e.r10*srot*sxrot+rot.e.r11*cxrot-rot.e.r12*crot*sxrot;
  1932. tran.e.r12= rot.e.r10*srot*cxrot+rot.e.r11*sxrot+rot.e.r12*crot*cxrot;
  1933. tran.e.r13= rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  1934. tran.e.r20= rot.e.r20*crot-rot.e.r22*srot;
  1935. tran.e.r21=-rot.e.r20*srot*sxrot+rot.e.r21*cxrot-rot.e.r22*crot*sxrot;
  1936. tran.e.r22= rot.e.r20*srot*cxrot+rot.e.r21*sxrot+rot.e.r22*crot*cxrot;
  1937. tran.e.r23= rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  1938. // Rotate all points of object
  1939. for (;p;p--)
  1940. {
  1941. x=inpt[0];
  1942. y=inpt[1];
  1943. z=inpt[2];
  1944. inpt+=3;
  1945. rx=x*tran.e.r00+y*tran.e.r01+z*tran.e.r02+tran.e.r03;
  1946. ry=x*tran.e.r10+y*tran.e.r11+z*tran.e.r12+tran.e.r13;
  1947. rz=x*tran.e.r20+y*tran.e.r21+z*tran.e.r22+tran.e.r23;
  1948. // Get perspective scaling of point
  1949. if (rz<SCREENDIST)
  1950. {
  1951. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  1952. qrz*=qrz; // mimics proper perspective for small...
  1953. qrz=persc*(qrz+.75); // and negative z values.
  1954. }
  1955. else
  1956. qrz=q/rz; // Normal scaling
  1957. //Add screen points to output list (with z values)
  1958. outpt[0]=rz;
  1959. outpt[1]=rx*qrz+render_buff.clip_xmid;
  1960. outpt[2]=ry*qrz+render_buff.clip_ymid;
  1961. outpt+=4; // add 4 so indexing can be done with shifts
  1962. }
  1963. addpols(ob);
  1964. curobj->nopols=curpol-curobj->polys;
  1965. curobj++;
  1966. }
  1967. }
  1968. // Routine for objects with y axis rotation, no z-clipping
  1969. void addobjy(obj *ob)
  1970. {
  1971. pt inpt=ob->points;
  1972. rpt outpt=rotlist;
  1973. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  1974. datapt x,y,z;
  1975. floatpt crot,srot;
  1976. rotpt rx,ry,rz,qrz;
  1977. // Get object depth
  1978. if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  1979. {
  1980. curobj->polys=curpol;
  1981. // Transform matrix derived from view rotation and object rotation
  1982. // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  1983. crot=ob->crot;
  1984. srot=ob->srot;
  1985. x=ob->x;
  1986. y=ob->y;
  1987. z=ob->z;
  1988. tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  1989. tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  1990. tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  1991. tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  1992. tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  1993. tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  1994. tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  1995. tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  1996. tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  1997. // Rotate all points of object
  1998. for (;p;p--)
  1999. {
  2000. x=inpt[0];
  2001. y=inpt[1];
  2002. z=inpt[2];
  2003. inpt+=3;
  2004. rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2005. ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2006. rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2007. // Get perspective scaling of point
  2008. if (rz<SCREENDIST)
  2009. {
  2010. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  2011. qrz*=qrz; // mimics proper perspective for small...
  2012. qrz=persc*(qrz+.75); // and negative z values.
  2013. /*
  2014. qrz=2-rz*scrdr; // Improved alternative perspective..
  2015. qrz=qrz*qrz*qrz; // slightly higher complexity.
  2016. qrz=persc*(qrz+2);
  2017. qrz/=3;
  2018. */ }
  2019. else
  2020. qrz=q/rz; // Normal scaling
  2021. //Add screen points to output list (with z values)
  2022. outpt[0]=rz;
  2023. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2024. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2025. outpt+=4; // add 4 so indexing can be done with shifts
  2026. }
  2027. addpols(ob);
  2028. curobj->nopols=curpol-curobj->polys;
  2029. curobj++;
  2030. }
  2031. }
  2032. // Routine for objects with y axis rotation, no z-clipping, z flipped (only players)
  2033. void addobjyf(obj *ob)
  2034. {
  2035. pt inpt=ob->points;
  2036. rpt outpt=rotlist;
  2037. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2038. datapt x,y,z;
  2039. floatpt crot,srot;
  2040. rotpt rx,ry,rz,qrz;
  2041. // Get object depth
  2042. if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2043. {
  2044. curobj->polys=curpol;
  2045. // Transform matrix derived from view rotation and object rotation
  2046. // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  2047. crot=ob->crot;
  2048. srot=ob->srot;
  2049. x=ob->x;
  2050. y=ob->y;
  2051. z=ob->z;
  2052. tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  2053. tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  2054. tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2055. tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  2056. tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  2057. tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2058. tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  2059. tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  2060. tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2061. // Rotate all points of object
  2062. for (;p;p--)
  2063. {
  2064. x=inpt[0];
  2065. y=inpt[1];
  2066. z=-inpt[2];
  2067. inpt+=3;
  2068. rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2069. ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2070. rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2071. // Get perspective scaling of point
  2072. if (rz<SCREENDIST)
  2073. {
  2074. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  2075. qrz*=qrz; // mimics proper perspective for small...
  2076. qrz=persc*(qrz+.75); // and negative z values.
  2077. /*
  2078. qrz=2-rz*scrdr; // Improved alternative perspective..
  2079. qrz=qrz*qrz*qrz; // slightly higher complexity.
  2080. qrz=persc*(qrz+2);
  2081. qrz/=3;
  2082. */ }
  2083. else
  2084. qrz=q/rz; // Normal scaling
  2085. //Add screen points to output list (with z values)
  2086. outpt[0]=rz;
  2087. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2088. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2089. outpt+=4; // add 4 so indexing can be done with shifts
  2090. }
  2091. addpols(ob);
  2092. curobj->nopols=curpol-curobj->polys;
  2093. curobj++;
  2094. }
  2095. }
  2096. // Routine for objects with y axis rotation & z-clipping
  2097. void addobjyc(obj *ob)
  2098. {
  2099. pt inpt=ob->points;
  2100. rpt outpt=rotlist;
  2101. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2102. datapt x,y,z;
  2103. floatpt crot,srot;
  2104. rotpt rx,ry,rz,qrz;
  2105. // Get object depth
  2106. curobj->z=objdep(*ob);
  2107. curobj->polys=curpol;
  2108. // Transform matrix derived from view rotation and object rotation
  2109. // Assumes r01=0 in view rotation and that r11 & r21 remain the same
  2110. crot=ob->crot;
  2111. srot=ob->srot;
  2112. x=ob->x;
  2113. y=ob->y;
  2114. z=ob->z;
  2115. tran.e.r00=rot.e.r00*crot-rot.e.r02*srot;
  2116. tran.e.r02=rot.e.r00*srot+rot.e.r02*crot;
  2117. tran.e.r03=rot.e.r00*x+rot.e.r01*y+rot.e.r02*z+rot.e.r03;
  2118. tran.e.r10=rot.e.r10*crot-rot.e.r12*srot;
  2119. tran.e.r12=rot.e.r10*srot+rot.e.r12*crot;
  2120. tran.e.r13=rot.e.r10*x+rot.e.r11*y+rot.e.r12*z+rot.e.r13;
  2121. tran.e.r20=rot.e.r20*crot-rot.e.r22*srot;
  2122. tran.e.r22=rot.e.r20*srot+rot.e.r22*crot;
  2123. tran.e.r23=rot.e.r20*x+rot.e.r21*y+rot.e.r22*z+rot.e.r23;
  2124. // Rotate all points of object
  2125. for (;p;p--)
  2126. {
  2127. x=inpt[0];
  2128. y=inpt[1];
  2129. z=inpt[2];
  2130. inpt+=3;
  2131. rx=x*tran.e.r00+z*tran.e.r02+tran.e.r03; // r01 is 0
  2132. ry=x*tran.e.r10+y*rot.e.r11+z*tran.e.r12+tran.e.r13;
  2133. rz=x*tran.e.r20+y*rot.e.r21+z*tran.e.r22+tran.e.r23;
  2134. // Get perspective scaling & add screen points to output list (with z values)
  2135. outpt[0]=rz;
  2136. if (rz<SCREENDIST)
  2137. {
  2138. outpt[1]=rx*persc; //These values used in clip calculation
  2139. outpt[2]=ry*persc;
  2140. }
  2141. else
  2142. {
  2143. qrz=q/rz; // Normal scaling
  2144. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2145. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2146. }
  2147. outpt+=4; // add 4 so indexing can be done with shifts
  2148. }
  2149. addpolsc(ob);
  2150. curobj->nopols=curpol-curobj->polys;
  2151. curobj++;
  2152. }
  2153. // Routine for objects with no rotation, no z-clipping
  2154. void addobjn(obj *ob)
  2155. {
  2156. pt inpt=ob->points;
  2157. rpt outpt=rotlist;
  2158. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2159. datapt x,y,z,tranx,trany,tranz;
  2160. rotpt rx,ry,rz,qrz;
  2161. // Get object depth
  2162. if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2163. {
  2164. curobj->polys=curpol;
  2165. tranx=ob->x;
  2166. trany=ob->y;
  2167. tranz=ob->z;
  2168. // Rotate all points of object
  2169. for (;p;p--)
  2170. {
  2171. x=tranx+inpt[0];
  2172. y=trany+inpt[1];
  2173. z=tranz+inpt[2];
  2174. inpt+=3;
  2175. rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2176. ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2177. rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2178. // Get perspective scaling of point
  2179. if (rz<SCREENDIST)
  2180. {
  2181. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  2182. qrz*=qrz; // mimics proper perspective for small...
  2183. qrz=persc*(qrz+.75); // and negative z values.
  2184. }
  2185. else
  2186. qrz=q/rz; // Normal scaling
  2187. //Add screen points to output list (with z values)
  2188. outpt[0]=rz;
  2189. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2190. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2191. outpt+=4; // add 4 so indexing can be done with shifts
  2192. }
  2193. addpols(ob);
  2194. curobj->nopols=curpol-curobj->polys;
  2195. curobj++;
  2196. }
  2197. }
  2198. // Routine for sprite objects (no rotation, no z-clipping)
  2199. void addobjsp(datapt *sprpt, word *refpt)
  2200. {
  2201. word p=(word)*(sprpt++); // No of sprites currently stored as datapt type!
  2202. datapt x,y,z;
  2203. rotpt rx,ry,rz,qrz;
  2204. // Rotate all sprite points and add to polygon list for sorting
  2205. for (;p;p--)
  2206. {
  2207. curobj->polys=curpol;
  2208. x=sprpt[0];
  2209. y=sprpt[1];
  2210. z=sprpt[2];
  2211. sprpt+=3;
  2212. rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2213. ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2214. rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2215. // Get perspective scaling of point
  2216. if (rz<SCREENDIST)
  2217. {
  2218. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  2219. qrz*=qrz; // mimics proper perspective for small...
  2220. qrz=persc*(qrz+.75); // and negative z values.
  2221. }
  2222. else
  2223. qrz=q/rz; // Normal scaling
  2224. rx=rx*qrz+render_buff.clip_xmid;
  2225. if (rz<CUTOFFDIST)
  2226. if (rx>=0)
  2227. rx=render_buff.clip_wid<<1;
  2228. else
  2229. rx=-render_buff.clip_wid;
  2230. curpol->pts=curpts;
  2231. curobj->z=curpol->z=rz;
  2232. curpts[0]=1;
  2233. curpts[1]=*(refpt++);
  2234. curpts[2]=rx;
  2235. curpts[3]=ry*qrz+render_buff.clip_ymid;
  2236. curpts+=4;
  2237. curpol++;
  2238. curobj->nopols=1;
  2239. curobj++;
  2240. }
  2241. }
  2242. // Routine for objects with no rotation & z-clipping
  2243. void addobjnc(obj *ob)
  2244. {
  2245. pt inpt=ob->points;
  2246. rpt outpt=rotlist;
  2247. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2248. datapt x,y,z,tranx,trany,tranz;
  2249. rotpt rx,ry,rz,qrz;
  2250. // Get object depth
  2251. curobj->z=objdep(*ob);
  2252. curobj->polys=curpol;
  2253. tranx=ob->x;
  2254. trany=ob->y;
  2255. tranz=ob->z;
  2256. // Rotate all points of object
  2257. for (;p;p--)
  2258. {
  2259. x=tranx+inpt[0];
  2260. y=trany+inpt[1];
  2261. z=tranz+inpt[2];
  2262. inpt+=3;
  2263. rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03; // r01 is 0
  2264. ry=x*rot.e.r10+y*rot.e.r11+z*rot.e.r12+rot.e.r13;
  2265. rz=x*rot.e.r20+y*rot.e.r21+z*rot.e.r22+rot.e.r23;
  2266. // Get perspective scaling & add screen points to output list (with z values)
  2267. outpt[0]=rz;
  2268. if (rz<SCREENDIST)
  2269. {
  2270. outpt[1]=rx*persc; //These values used in clip calculation
  2271. outpt[2]=ry*persc;
  2272. }
  2273. else
  2274. {
  2275. qrz=q/rz; // Normal scaling
  2276. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2277. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2278. }
  2279. outpt+=4; // add 4 so indexing can be done with shifts
  2280. }
  2281. addpolsc(ob);
  2282. curobj->nopols=curpol-curobj->polys;
  2283. curobj++;
  2284. }
  2285. // Routine for objects with no rotation and all y=0, no z-clipping
  2286. void addobjf(obj *ob)
  2287. {
  2288. pt inpt=ob->points;
  2289. rpt outpt=rotlist;
  2290. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2291. datapt x,z,tranx,tranz;
  2292. rotpt rx,ry,rz,qrz;
  2293. // Get object depth
  2294. if ((curobj->z=objdep(*ob))>CUTOFFDIST)
  2295. {
  2296. curobj->polys=curpol;
  2297. tranx=ob->x;
  2298. tranz=ob->z;
  2299. // Rotate all points of object
  2300. for (;p;p--)
  2301. {
  2302. x=tranx+inpt[0];
  2303. z=tranz+inpt[2];
  2304. inpt+=3;
  2305. rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03;
  2306. ry=x*rot.e.r10+z*rot.e.r12+rot.e.r13;
  2307. rz=x*rot.e.r20+z*rot.e.r22+rot.e.r23;
  2308. // Get perspective scaling of point
  2309. if (rz<SCREENDIST)
  2310. {
  2311. qrz=1.5-rz*scrdr; // Alternative perspective scaling...
  2312. qrz*=qrz; // mimics proper perspective for small...
  2313. qrz=persc*(qrz+.75); // and negative z values.
  2314. }
  2315. else
  2316. qrz=q/rz; // Normal scaling
  2317. //Add screen points to output list (with z values)
  2318. outpt[0]=rz;
  2319. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2320. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2321. outpt+=4; // add 4 so indexing can be done with shifts
  2322. }
  2323. addpols(ob);
  2324. curobj->nopols=curpol-curobj->polys;
  2325. curobj++;
  2326. }
  2327. }
  2328. // Routine for objects with no rotation and all y=0, with z-clipping
  2329. void addobjfc(obj *ob)
  2330. {
  2331. pt inpt=ob->points;
  2332. rpt outpt=rotlist;
  2333. word p=(word)*inpt++; // No of pts currently stored as datapt type!
  2334. datapt x,z,tranx,tranz;
  2335. rotpt rx,ry,rz,qrz;
  2336. // Get object depth
  2337. curobj->z=objdep(*ob);
  2338. curobj->polys=curpol;
  2339. tranx=ob->x;
  2340. tranz=ob->z;
  2341. // Rotate all points of object
  2342. for (;p;p--)
  2343. {
  2344. x=tranx+inpt[0];
  2345. z=tranz+inpt[2];
  2346. inpt+=3;
  2347. rx=x*rot.e.r00+z*rot.e.r02+rot.e.r03;
  2348. ry=x*rot.e.r10+z*rot.e.r12+rot.e.r13;
  2349. rz=x*rot.e.r20+z*rot.e.r22+rot.e.r23;
  2350. // Get perspective scaling & add screen points to output list (with z values)
  2351. outpt[0]=rz;
  2352. if (rz<SCREENDIST)
  2353. {
  2354. outpt[1]=rx*persc; //These values used in clip calculation
  2355. outpt[2]=ry*persc;
  2356. }
  2357. else
  2358. {
  2359. qrz=q/rz; // Normal scaling
  2360. outpt[1]=rx*qrz+render_buff.clip_xmid;
  2361. outpt[2]=ry*qrz+render_buff.clip_ymid;
  2362. }
  2363. outpt+=4; // add 4 so indexing can be done with shifts
  2364. }
  2365. addpolsc(ob);
  2366. curobj->nopols=curpol-curobj->polys;
  2367. curobj++;
  2368. }
  2369. /************************************************/
  2370. /* SORT, DISPLAY AND RESET OBJECT/POLYGON LISTS */
  2371. // Macro to reset object/polygon/point lists
  2372. #define clearlists curobj=objlist,curpol=pollist,curpts=ptslist;
  2373. // Object depth comparison for qsort
  2374. int objcmp(void const *obj1, void const *obj2)
  2375. {
  2376. // Avoids unnessecary float to int conversions, assumes true=1
  2377. return (((objs *)obj1)->z<=((objs *)obj2)->z ? ((objs *)obj1)->z<((objs *)obj2)->z : -1);
  2378. }
  2379. // Polygon depth comparison for qsort
  2380. int polcmp(void const *pol1, void const *pol2)
  2381. {
  2382. // Avoids unnessecary float to int conversions, assumes true=1
  2383. return (((pols *)pol1)->z<=((pols *)pol2)->z ? ((pols *)pol1)->z<((pols *)pol2)->z : -1);
  2384. }
  2385. // Sort the polygons within a single object
  2386. #define sortobj(ob) qsort((ob)->polys,(ob)->nopols,sizeof(pols),polcmp);
  2387. // Draw polygons after sorting
  2388. void
  2389. dispols()
  2390. {
  2391. objs *cobj=objlist;
  2392. short i,n;
  2393. word np,col;
  2394. dword *polytex;
  2395. // Sort objects from z value
  2396. qsort(objlist,curobj-objlist,sizeof(objs),objcmp);
  2397. // Draw the polygons associated with the sorted list
  2398. while (cobj!=curobj)
  2399. {
  2400. n=cobj->nopols;
  2401. curpol=cobj++->polys;
  2402. for (i=0;i<n;i++)
  2403. {
  2404. curpts=curpol++->pts;
  2405. np=(word)curpts[0];
  2406. col=(word)curpts[1];
  2407. curpts+=2;
  2408. if (col>=512) col=257;
  2409. // Choose routine to use from np & col
  2410. if (col<-2000)
  2411. {
  2412. polytex=(dword *)&textures[-col-2000];
  2413. polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2414. continue;
  2415. }
  2416. if (col<0)
  2417. {
  2418. polytex=(dword *)&textures[-col];
  2419. polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2420. continue;
  2421. }
  2422. if (col>=512)
  2423. {
  2424. polytex=(dword *)&texloop[(col&255)].tex;
  2425. // polytex=(dword *)&textures[(col&255)+S_TM];
  2426. polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  2427. // polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  2428. continue;
  2429. }
  2430. if (col>=256)
  2431. {
  2432. polyf((pnt *)curpts,np,filters[col&255]);
  2433. continue;
  2434. }
  2435. if (np<=2)
  2436. if (np==1)
  2437. {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  2438. else
  2439. line((pnt *)curpts,col);
  2440. else
  2441. polyb((pnt *)curpts,np,col);
  2442. }
  2443. }
  2444. clearlists
  2445. }
  2446. // Draw flat polys on 3D Blaster
  2447. void dispols3DB()
  2448. {
  2449. objs *cobj=objlist;
  2450. short i,j,k,n;
  2451. word np,p,pt,pl,col;
  2452. CGL_VERTEX2D_ST *pts3d,*lpts3d;
  2453. CGL_COLOR_ST *col3d,*lcol3d;
  2454. int tpts1[24];
  2455. int tpts2[24];
  2456. int cp;
  2457. pts3d=&Vertex[0];
  2458. col3d=&Colour[0];
  2459. lpts3d=&lVertex[0];
  2460. lcol3d=&lColour[0];
  2461. // Draw the polygons associated with the sorted list
  2462. while (cobj!=curobj)
  2463. {
  2464. n=cobj->nopols;
  2465. curpol=cobj++->polys;
  2466. for (i=0;i<n;i++)
  2467. {
  2468. curpts=curpol++->pts;
  2469. np=(word)curpts[0]<<1;
  2470. col=(word)curpts[1];
  2471. curpts+=2;
  2472. p=0;
  2473. for (j=0;j<np;j+=2)
  2474. {
  2475. k=j+2;
  2476. if (k==np) k=0;
  2477. if (curpts[j]>=0)
  2478. if (curpts[k]>=0)
  2479. {
  2480. tpts1[p++]=curpts[k];
  2481. tpts1[p++]=curpts[k+1];
  2482. }
  2483. else
  2484. {
  2485. tpts1[p++]=0;
  2486. tpts1[p++]=curpts[j+1]+((curpts[k+1]-curpts[j+1])*curpts[j])/(curpts[j]-curpts[k]);
  2487. }
  2488. else
  2489. if (curpts[k]>=0)
  2490. {
  2491. if (np!=4)
  2492. {
  2493. tpts1[p++]=0;
  2494. tpts1[p++]=curpts[k+1]+((curpts[j+1]-curpts[k+1])*curpts[k])/(curpts[k]-curpts[j]);
  2495. }
  2496. tpts1[p++]=curpts[k];
  2497. tpts1[p++]=curpts[k+1];
  2498. }
  2499. }
  2500. pt=0;
  2501. for (j=0;j<p;j+=2)
  2502. {
  2503. k=j+2;
  2504. if (k==p) k=0;
  2505. if (tpts1[j]<=render_buff.clip_wid)
  2506. if (tpts1[k]<=render_buff.clip_wid)
  2507. {
  2508. tpts2[pt++]=tpts1[k];
  2509. tpts2[pt++]=tpts1[k+1];
  2510. }
  2511. else
  2512. {
  2513. tpts2[pt++]=render_buff.clip_wid;
  2514. tpts2[pt++]=tpts1[j+1]+((tpts1[k+1]-tpts1[j+1])*(render_buff.clip_wid-tpts1[j]))/(tpts1[k]-tpts1[j]);
  2515. }
  2516. else
  2517. if (tpts1[k]<=render_buff.clip_wid)
  2518. {
  2519. if (np!=4)
  2520. {
  2521. tpts2[pt++]=render_buff.clip_wid;
  2522. tpts2[pt++]=tpts1[k+1]+((tpts1[j+1]-tpts1[k+1])*(render_buff.clip_wid-tpts1[k]))/(tpts1[j]-tpts1[k]);
  2523. }
  2524. tpts2[pt++]=tpts1[k];
  2525. tpts2[pt++]=tpts1[k+1];
  2526. }
  2527. }
  2528. cp=((np==4)?1:0);
  2529. p=0;
  2530. for (j=0;j<pt;j+=2)
  2531. {
  2532. k=j+2;
  2533. if (k==pt) k=0;
  2534. if (tpts2[j+1]>=cp)
  2535. if (tpts2[k+1]>=cp)
  2536. {
  2537. tpts1[p++]=tpts2[k];
  2538. tpts1[p++]=tpts2[k+1];
  2539. }
  2540. else
  2541. {
  2542. tpts1[p++]=tpts2[j]+((tpts2[k]-tpts2[j])*tpts2[j+1])/(tpts2[j+1]-tpts2[k+1]);
  2543. tpts1[p++]=cp;
  2544. }
  2545. else
  2546. if (tpts2[k+1]>=cp)
  2547. {
  2548. if (np!=4)
  2549. {
  2550. tpts1[p++]=tpts2[k]+((tpts2[j]-tpts2[k])*tpts2[k+1])/(tpts2[k+1]-tpts2[j+1]);
  2551. tpts1[p++]=cp;
  2552. }
  2553. tpts1[p++]=tpts2[k];
  2554. tpts1[p++]=tpts2[k+1];
  2555. }
  2556. }
  2557. pt=0;
  2558. for (j=0;j<p;j+=2)
  2559. {
  2560. k=j+2;
  2561. if (k==p) k=0;
  2562. if (tpts1[j+1]<=render_buff.clip_hgtl)
  2563. if (tpts1[k+1]<=render_buff.clip_hgtl)
  2564. {
  2565. pts3d[pt].x=tpts1[k]<<16;
  2566. pts3d[pt++].y=tpts1[k+1]<<16;
  2567. }
  2568. else
  2569. {
  2570. pts3d[pt].x=(tpts1[j]+((tpts1[k]-tpts1[j])*(render_buff.clip_hgt-tpts1[j+1]))/(tpts1[k+1]-tpts1[j+1]))<<16;
  2571. pts3d[pt++].y=render_buff.clip_hgtl<<16;
  2572. }
  2573. else
  2574. if (tpts1[k+1]<=render_buff.clip_hgtl)
  2575. {
  2576. if (np!=4)
  2577. {
  2578. pts3d[pt].x=(tpts1[k]+((tpts1[j]-tpts1[k])*(render_buff.clip_hgt-tpts1[k+1]))/(tpts1[j+1]-tpts1[k+1]))<<16;
  2579. pts3d[pt++].y=render_buff.clip_hgtl<<16;
  2580. }
  2581. pts3d[pt].x=tpts1[k]<<16;
  2582. pts3d[pt++].y=tpts1[k+1]<<16;
  2583. }
  2584. }
  2585. p=0;
  2586. pl=pt;
  2587. while (pl>4)
  2588. {
  2589. p+=4;
  2590. pt+=2;
  2591. pl-=2;
  2592. for (j=pt-1;j>p;j--)
  2593. {
  2594. pts3d[j].x=pts3d[j-2].x;
  2595. pts3d[j].y=pts3d[j-2].y;
  2596. }
  2597. pts3d[p].x=pts3d[0].x;
  2598. pts3d[p].y=pts3d[0].y;
  2599. }
  2600. p+=pl;
  2601. if (pl<=3)
  2602. {
  2603. if (pl==3)
  2604. {
  2605. pts3d[p].x=pts3d[0].x;
  2606. pts3d[p].y=pts3d[0].y;
  2607. p++;
  2608. }
  2609. else
  2610. if (pl==2)
  2611. {
  2612. if (pts3d[0].y<0x20000) pts3d[0].y=0x20000;
  2613. if (pts3d[1].y<0x20000) pts3d[1].y=0x20000;
  2614. lpts3d[0].x=pts3d[0].x;
  2615. lpts3d[0].y=pts3d[0].y;
  2616. lpts3d[1].x=pts3d[1].x;
  2617. lpts3d[1].y=pts3d[1].y;
  2618. lcol3d->bRed=col;
  2619. lcol3d+=2;
  2620. lpts3d+=2;
  2621. goto dpline;
  2622. }
  2623. }
  2624. while (p)
  2625. {
  2626. col3d->bRed=col;
  2627. col3d+=4;
  2628. pts3d+=4;
  2629. p-=4;
  2630. }
  2631. dpline:;
  2632. }
  2633. }
  2634. SetLineOutput3DB();
  2635. if ((p=lpts3d-lVertex)>0)
  2636. Render3DB(p);
  2637. SetFlatQuadOutput3DB();
  2638. if ((p=pts3d-Vertex)>0)
  2639. Render3DB(p);
  2640. clearlists
  2641. }
  2642. // Draw polygons without sorting
  2643. void dispolsn()
  2644. {
  2645. objs *cobj=objlist;
  2646. short i,n;
  2647. word np,col;
  2648. dword *polytex;
  2649. while (cobj!=curobj)
  2650. {
  2651. n=cobj->nopols;
  2652. curpol=cobj++->polys;
  2653. for (i=0;i<n;i++)
  2654. {
  2655. curpts=curpol++->pts;
  2656. np=(word)curpts[0];
  2657. col=(word)curpts[1];
  2658. curpts+=2;
  2659. if (col>=512) col=257;
  2660. // Choose routine to use from np & col
  2661. if (col<-2000)
  2662. {
  2663. polytex=(dword *)&textures[-col-2000];
  2664. polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2665. continue;
  2666. }
  2667. if (col<0)
  2668. {
  2669. polytex=(dword *)&textures[-col];
  2670. polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2671. continue;
  2672. }
  2673. if (col>=512)
  2674. {
  2675. polytex=(dword *)&texloop[(col&255)].tex;
  2676. // polytex=(dword *)&textures[(col&255)+S_TM];
  2677. polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  2678. // polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  2679. continue;
  2680. }
  2681. if (col>=256)
  2682. {
  2683. polyf((pnt *)curpts,np,filters[col&255]);
  2684. continue;
  2685. }
  2686. if (np<=2)
  2687. if (np==1)
  2688. {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  2689. else
  2690. line((pnt *)curpts,col);
  2691. else
  2692. polyb((pnt *)curpts,np,col);
  2693. }
  2694. }
  2695. clearlists
  2696. }
  2697. // Draw sorted texture maps on 3D Blaster
  2698. void dispolst3DB()
  2699. {
  2700. objs *cobj=objlist;
  2701. short i,j,k,n;
  2702. word np,p,pt,pl,col;
  2703. float fc;
  2704. CGL_VERTEX2D_ST *pts3d;
  2705. CGL_TEXTURE2D_ST *tex3d;
  2706. CGL_COLOR_ST *col3d;
  2707. int tpts1[16];
  2708. int tpts2[16];
  2709. int ttex1[16];
  2710. int ttex2[16];
  2711. dword *polytexx,*polytexy,pmx;
  2712. pts3d=&Vertex[0];
  2713. tex3d=&Texture[0];
  2714. // Draw the polygons associated with the sorted list
  2715. while (cobj!=curobj)
  2716. {
  2717. n=cobj->nopols;
  2718. curpol=cobj++->polys;
  2719. for (i=0;i<n;i++)
  2720. {
  2721. curpts=curpol++->pts;
  2722. if ((np=(word)curpts[0])<3) goto errpol;
  2723. col=(word)curpts[1];
  2724. curpts+=2;
  2725. if (col<0)
  2726. {
  2727. if (col<-2000) col+=2000;
  2728. polytexy=(dword *)&textures[-col];
  2729. polytexx=polytexy+np;
  2730. pmx=(*polytexy&0xc000000)>>2;
  2731. np<<=1;
  2732. p=0;
  2733. for (j=0;j<np;j+=2)
  2734. {
  2735. k=j+2;
  2736. if (k==np) k=0;
  2737. if (curpts[j]>=0)
  2738. if (curpts[k]>=0)
  2739. {
  2740. tpts1[p]=curpts[k];
  2741. ttex1[p++]=(polytexx[k>>1]|pmx);
  2742. tpts1[p]=curpts[k+1];
  2743. ttex1[p++]=polytexy[k>>1]&0x3ffffff;
  2744. }
  2745. else
  2746. {
  2747. fc=(float)curpts[j]/(curpts[j]-curpts[k]);
  2748. tpts1[p]=0;
  2749. ttex1[p++]=((polytexx[j>>1]+(int)(fc*(polytexx[k>>1]-polytexx[j>>1])))|pmx);
  2750. tpts1[p]=curpts[j+1]+(int)(fc*(curpts[k+1]-curpts[j+1]));
  2751. ttex1[p++]=(polytexy[j>>1]+(int)(fc*(polytexy[k>>1]-polytexy[j>>1])))&0x3ffffff;
  2752. }
  2753. else
  2754. if (curpts[k]>=0)
  2755. {
  2756. fc=(float)curpts[k]/(curpts[k]-curpts[j]);
  2757. tpts1[p]=0;
  2758. ttex1[p++]=((polytexx[k>>1]+(int)(fc*(polytexx[j>>1]-polytexx[k>>1])))|pmx);
  2759. tpts1[p]=curpts[k+1]+(int)(fc*(curpts[j+1]-curpts[k+1]));
  2760. ttex1[p++]=(polytexy[k>>1]+(int)(fc*(polytexy[j>>1]-polytexy[k>>1])))&0x3ffffff;
  2761. tpts1[p]=curpts[k];
  2762. ttex1[p++]=(polytexx[k>>1]|pmx);
  2763. tpts1[p]=curpts[k+1];
  2764. ttex1[p++]=polytexy[k>>1]&0x3ffffff;
  2765. }
  2766. }
  2767. }
  2768. else
  2769. {
  2770. if (col>=512) col=257;
  2771. if (col==256) col=9;
  2772. if (col==257) col=24;
  2773. if (!col) col=2;
  2774. pmx=0x1008000|(col<<16);
  2775. np<<=1;
  2776. p=0;
  2777. for (j=0;j<np;j+=2)
  2778. {
  2779. k=j+2;
  2780. if (k==np) k=0;
  2781. if (curpts[j]>=0)
  2782. if (curpts[k]>=0)
  2783. {
  2784. tpts1[p]=curpts[k];
  2785. ttex1[p++]=pmx;
  2786. tpts1[p]=curpts[k+1];
  2787. ttex1[p++]=0x3508000;
  2788. }
  2789. else
  2790. {
  2791. fc=(float)curpts[j]/(curpts[j]-curpts[k]);
  2792. tpts1[p]=0;
  2793. ttex1[p++]=pmx;
  2794. tpts1[p]=curpts[j+1]+(int)(fc*(curpts[k+1]-curpts[j+1]));
  2795. ttex1[p++]=0x3508000;
  2796. }
  2797. else
  2798. if (curpts[k]>=0)
  2799. {
  2800. fc=(float)curpts[k]/(curpts[k]-curpts[j]);
  2801. tpts1[p]=0;
  2802. ttex1[p++]=pmx;
  2803. tpts1[p]=curpts[k+1]+(int)(fc*(curpts[j+1]-curpts[k+1]));
  2804. ttex1[p++]=0x3508000;
  2805. tpts1[p]=curpts[k];
  2806. ttex1[p++]=pmx;
  2807. tpts1[p]=curpts[k+1];
  2808. ttex1[p++]=0x3508000;
  2809. }
  2810. }
  2811. }
  2812. pt=0;
  2813. for (j=0;j<p;j+=2)
  2814. {
  2815. k=j+2;
  2816. if (k==p) k=0;
  2817. if (tpts1[j]<=render_buff.clip_wid)
  2818. if (tpts1[k]<=render_buff.clip_wid)
  2819. {
  2820. tpts2[pt]=tpts1[k];
  2821. ttex2[pt++]=ttex1[k];
  2822. tpts2[pt]=tpts1[k+1];
  2823. ttex2[pt++]=ttex1[k+1];
  2824. }
  2825. else
  2826. {
  2827. fc=(float)(render_buff.clip_wid-tpts1[j])/(tpts1[k]-tpts1[j]);
  2828. tpts2[pt]=render_buff.clip_wid;
  2829. ttex2[pt++]=ttex1[j]+(int)(fc*(ttex1[k]-ttex1[j]));
  2830. tpts2[pt]=tpts1[j+1]+(int)(fc*(tpts1[k+1]-tpts1[j+1]));
  2831. ttex2[pt++]=ttex1[j+1]+(int)(fc*(ttex1[k+1]-ttex1[j+1]));
  2832. }
  2833. else
  2834. if (tpts1[k]<=render_buff.clip_wid)
  2835. {
  2836. fc=(float)(render_buff.clip_wid-tpts1[k])/(tpts1[j]-tpts1[k]);
  2837. tpts2[pt]=render_buff.clip_wid;
  2838. ttex2[pt++]=ttex1[k]+(int)(fc*(ttex1[j]-ttex1[k]));
  2839. tpts2[pt]=tpts1[k+1]+(int)(fc*(tpts1[j+1]-tpts1[k+1]));
  2840. ttex2[pt++]=ttex1[k+1]+(int)(fc*(ttex1[j+1]-ttex1[k+1]));
  2841. tpts2[pt]=tpts1[k];
  2842. ttex2[pt++]=ttex1[k];
  2843. tpts2[pt]=tpts1[k+1];
  2844. ttex2[pt++]=ttex1[k+1];
  2845. }
  2846. }
  2847. p=0;
  2848. for (j=0;j<pt;j+=2)
  2849. {
  2850. k=j+2;
  2851. if (k==pt) k=0;
  2852. if (tpts2[j+1]>=0)
  2853. if (tpts2[k+1]>=0)
  2854. {
  2855. tpts1[p]=tpts2[k];
  2856. ttex1[p++]=ttex2[k];
  2857. tpts1[p]=tpts2[k+1];
  2858. ttex1[p++]=ttex2[k+1];
  2859. }
  2860. else
  2861. {
  2862. fc=(float)tpts2[j+1]/(tpts2[j+1]-tpts2[k+1]);
  2863. tpts1[p]=tpts2[j]+(int)(fc*(tpts2[k]-tpts2[j]));
  2864. ttex1[p++]=ttex2[j]+(int)(fc*(ttex2[k]-ttex2[j]));
  2865. tpts1[p]=0;
  2866. ttex1[p++]=ttex2[j+1]+(int)(fc*(ttex2[k+1]-ttex2[j+1]));
  2867. }
  2868. else
  2869. if (tpts2[k+1]>=0)
  2870. {
  2871. fc=(float)tpts2[k+1]/(tpts2[k+1]-tpts2[j+1]);
  2872. tpts1[p]=tpts2[k]+(int)(fc*(tpts2[j]-tpts2[k]));
  2873. ttex1[p++]=ttex2[k]+(int)(fc*(ttex2[j]-ttex2[k]));
  2874. tpts1[p]=0;
  2875. ttex1[p++]=ttex2[k+1]+(int)(fc*(ttex2[j+1]-ttex2[k+1]));
  2876. tpts1[p]=tpts2[k];
  2877. ttex1[p++]=ttex2[k];
  2878. tpts1[p]=tpts2[k+1];
  2879. ttex1[p++]=ttex2[k+1];
  2880. }
  2881. }
  2882. pt=0;
  2883. for (j=0;j<p;j+=2)
  2884. {
  2885. k=j+2;
  2886. if (k==p) k=0;
  2887. if (tpts1[j+1]<=render_buff.clip_hgtl)
  2888. if (tpts1[k+1]<=render_buff.clip_hgtl)
  2889. {
  2890. pts3d[pt].x=tpts1[k]<<16;
  2891. tex3d[pt].s=ttex1[k];
  2892. pts3d[pt].y=tpts1[k+1]<<16;
  2893. tex3d[pt++].t=ttex1[k+1];
  2894. }
  2895. else
  2896. {
  2897. fc=(float)(render_buff.clip_hgtl-tpts1[j+1])/(tpts1[k+1]-tpts1[j+1]);
  2898. pts3d[pt].x=(tpts1[j]+(int)(fc*(tpts1[k]-tpts1[j])))<<16;
  2899. tex3d[pt].s=ttex1[j]+(int)(fc*(ttex1[k]-ttex1[j]));
  2900. pts3d[pt].y=render_buff.clip_hgtl<<16;
  2901. tex3d[pt++].t=ttex1[j+1]+(int)(fc*(ttex1[k+1]-ttex1[j+1]));
  2902. }
  2903. else
  2904. if (tpts1[k+1]<=render_buff.clip_hgtl)
  2905. {
  2906. fc=(float)(render_buff.clip_hgtl-tpts1[k+1])/(tpts1[j+1]-tpts1[k+1]);
  2907. pts3d[pt].x=(tpts1[k]+(int)(fc*(tpts1[j]-tpts1[k])))<<16;
  2908. tex3d[pt].s=ttex1[k]+(int)(fc*(ttex1[j]-ttex1[k]));
  2909. pts3d[pt].y=render_buff.clip_hgtl<<16;
  2910. tex3d[pt++].t=ttex1[k+1]+(int)(fc*(ttex1[j+1]-ttex1[k+1]));
  2911. pts3d[pt].x=tpts1[k]<<16;
  2912. tex3d[pt].s=ttex1[k];
  2913. pts3d[pt].y=tpts1[k+1]<<16;
  2914. tex3d[pt++].t=ttex1[k+1];
  2915. }
  2916. }
  2917. p=0;
  2918. pl=pt;
  2919. while (pl>4)
  2920. {
  2921. p+=4;
  2922. pt+=2;
  2923. pl-=2;
  2924. for (j=pt-1;j>p;j--)
  2925. {
  2926. pts3d[j].x=pts3d[j-2].x;
  2927. pts3d[j].y=pts3d[j-2].y;
  2928. tex3d[j].s=tex3d[j-2].s;
  2929. tex3d[j].t=tex3d[j-2].t;
  2930. }
  2931. pts3d[p].x=pts3d[0].x;
  2932. pts3d[p].y=pts3d[0].y;
  2933. tex3d[p].s=tex3d[0].s;
  2934. tex3d[p].t=tex3d[0].t;
  2935. }
  2936. p+=pl;
  2937. if (pl==3)
  2938. {
  2939. pts3d[p].x=pts3d[0].x;
  2940. pts3d[p].y=pts3d[0].y;
  2941. tex3d[p].s=tex3d[0].s;
  2942. tex3d[p].t=tex3d[0].t;
  2943. p++;
  2944. }
  2945. pts3d+=p;
  2946. tex3d+=p;
  2947. errpol:;
  2948. }
  2949. }
  2950. SetTextureQuadOutput3DB(texaddr3DB[0]);
  2951. if ((p=pts3d-Vertex)>0)
  2952. Render3DB(p);
  2953. clearlists
  2954. }
  2955. // Draw polygons without sorting (overlapping polys)
  2956. void dispolsnx()
  2957. {
  2958. objs *cobj=objlist;
  2959. short i,n;
  2960. word np,col;
  2961. dword *polytex;
  2962. while (cobj!=curobj)
  2963. {
  2964. n=cobj->nopols;
  2965. curpol=cobj++->polys;
  2966. for (i=0;i<n;i++)
  2967. {
  2968. curpts=curpol++->pts;
  2969. np=(word)curpts[0];
  2970. col=(word)curpts[1];
  2971. curpts+=2;
  2972. if (col>=512) col=257;
  2973. // Choose routine to use from np & col
  2974. if (col<-2000)
  2975. {
  2976. polytex=(dword *)&textures[-col-2000];
  2977. polyt((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2978. continue;
  2979. }
  2980. if (col<0)
  2981. {
  2982. polytex=(dword *)&textures[-col];
  2983. polym((pnt *)curpts,np,mapsel[*(((BYTE *)polytex)+3)],polytex+np,polytex);
  2984. continue;
  2985. }
  2986. if (col>=512)
  2987. {
  2988. polytex=(dword *)&texloop[(col&255)].tex;
  2989. // polytex=(dword *)&textures[(col&255)+S_TM];
  2990. polyl((pnt *)curpts,np,mapsel[mappages-2+(col&255)],polytex+np,polytex);
  2991. // polyl((pnt *)curpts,np,mapsel[mappages-2+(col>>8)],polytex+np,polytex);
  2992. continue;
  2993. }
  2994. if (col>=256)
  2995. {
  2996. polyf((pnt *)curpts,np,filters[col&255]);
  2997. continue;
  2998. }
  2999. if (np<=2)
  3000. if (np==1)
  3001. {sprite3d(curpts[0]/render_buff.scale_x,(render_buff.clip_hgt-curpts[1])/render_buff.scale_y,col);curpts+=2;}
  3002. else
  3003. line((pnt *)curpts,col);
  3004. else
  3005. poly((pnt *)curpts,np,col);
  3006. }
  3007. }
  3008. clearlists
  3009. }
  3010. /********************/
  3011. /* PALETTE ROUTINES */
  3012. /*
  3013. // Set palette
  3014. void setpal()
  3015. {
  3016. short i;
  3017. unsigned char *p=pal;
  3018. for (i=0;i<256;i++)
  3019. {
  3020. outp(0x3c8,i);
  3021. outp(0x3c9,*p++);
  3022. outp(0x3c9,*p++);
  3023. outp(0x3c9,*p++);
  3024. }
  3025. }
  3026. // Get palette
  3027. void getpal()
  3028. {
  3029. short i;
  3030. unsigned char *p=pal;
  3031. for (i=0;i<256;i++)
  3032. {
  3033. outp(0x3c7,i);
  3034. *p++=inp(0x3c9);
  3035. *p++=inp(0x3c9);
  3036. *p++=inp(0x3c9);
  3037. }
  3038. }
  3039. */
  3040. void setpal()
  3041. {
  3042. union REGS regs;
  3043. struct SREGS sregs;
  3044. memset(&sregs,0,sizeof(sregs));
  3045. regs.w.ax=0x1012;
  3046. regs.w.bx=0;
  3047. regs.w.cx=256;
  3048. regs.x.edx=FP_OFF(&pal[0]);
  3049. sregs.es=FP_SEG(&pal[0]);
  3050. int386x(0x10,&regs,&regs,&sregs);
  3051. }
  3052. /*
  3053. void getpal()
  3054. {
  3055. union REGS regs;
  3056. struct SREGS sregs;
  3057. memset(&sregs,0,sizeof(sregs));
  3058. regs.w.ax=0x1017;
  3059. regs.w.bx=0;
  3060. regs.w.cx=256;
  3061. regs.x.edx=FP_OFF(&pal[0]);
  3062. sregs.es=FP_SEG(&pal[0]);
  3063. int386x(0x10,&regs,&regs,&sregs);
  3064. }
  3065. void readcolour(unsigned short c,unsigned char r,unsigned char g,unsigned char b)
  3066. {
  3067. union REGS regs;
  3068. regs.w.ax=0x1010;
  3069. regs.w.bx=c;
  3070. regs.h.ch=g;
  3071. regs.h.cl=b;
  3072. regs.h.dh=r;
  3073. int386(0x10,&regs,&regs);
  3074. }
  3075. void writecolour(unsigned short c,unsigned char *r,unsigned char *g,unsigned char *b)
  3076. {
  3077. union REGS regs;
  3078. regs.w.ax=0x1015;
  3079. regs.w.bx=c;
  3080. int386(0x10,&regs,&regs);
  3081. *g=regs.h.ch;
  3082. *b=regs.h.cl;
  3083. *r=regs.h.dh;
  3084. }
  3085. */
  3086. // Make a filter array for polygon filters
  3087. void makefilter(filter filt,byte fr,byte fg,byte fb,float mr,float mg,float mb)
  3088. {
  3089. word r1,g1,b1,r2,g2,b2;
  3090. word x,s,c,l1,l2,d1,d2;
  3091. if ((l1=sqrt(fr*fr+fg*fg+fb*fb))==0) l1=1;
  3092. for (x=0;x<768;x+=3)
  3093. {
  3094. l2=sqrt(pal[x]*pal[x]+pal[x+1]*pal[x+1]+pal[x+2]*pal[x+2]);
  3095. r1=pal[x]+mr*(fr*l2/l1-pal[x]);
  3096. if (r1<0) r1=0;if (r1>255) r1=255;
  3097. g1=pal[x+1]+mg*(fg*l2/l1-pal[x+1]);
  3098. if (g1<0) g1=0;if (g1>255) g1=255;
  3099. b1=pal[x+2]+mb*(fb*l2/l1-pal[x+2]);
  3100. if (b1<0) b1=0;if (b1>255) b1=255;
  3101. r1=(fr-pal[x])*mr+pal[x];
  3102. g1=(fg-pal[x+1])*mg+pal[x+1];
  3103. b1=(fb-pal[x+2])*mb+pal[x+2];
  3104. d1=128;
  3105. for (s=0;s<768-16*3;s+=3)
  3106. {
  3107. r2=(pal[s]-r1);
  3108. g2=(pal[s+1]-g1);
  3109. b2=(pal[s+2]-b1);
  3110. d2=sqrt(r2*r2+g2*g2+b2*b2);
  3111. if (d2<d1) d1=d2,c=s;
  3112. }
  3113. filt[x/3]=c/3;
  3114. }
  3115. }
  3116. void makehilite(filter filt,short add)
  3117. {
  3118. short s;
  3119. for (s=0;s<256;s++)
  3120. filt[s]=(s&15)+add;
  3121. }
  3122. /*******************/
  3123. /* (S)VGA ROUTINES */
  3124. // Set standard VGA mode
  3125. void VGAmode(BYTE mode)
  3126. {
  3127. union REGS r;
  3128. r.h.al=(char)mode;
  3129. r.h.ah=0;
  3130. int386(0x10,&r,&r);
  3131. }
  3132. // Switch screen mode through VESAmode list & MCGA (0x13)
  3133. // or through 3dBlaster modes
  3134. void switchmode()
  3135. {
  3136. short i;
  3137. if (scrmode3DB<0)
  3138. {
  3139. if (scrmode==0x13)
  3140. {
  3141. testVESA=0;
  3142. scrmode=VESAmode(&modelist[i=0]);
  3143. while (scrmode!=modelist[i] && ++i!=VESAMODES);
  3144. if (i!=VESAMODES)
  3145. main_buff=VESA_buff[i][setup.screen_size];
  3146. else
  3147. scrmode=0x13;
  3148. }
  3149. else
  3150. {
  3151. VGAmode(0x13);
  3152. main_buff=MCGA_buff[setup.screen_size];
  3153. scrmode=0x13;
  3154. }
  3155. setpal();
  3156. }
  3157. else
  3158. {
  3159. #ifdef BLASTDEMO
  3160. if (++scrmode3DB==MODES_3DB||(scrmode3DB=ChangeScreenMode3DB(modelist3DB+scrmode3DB))<0)
  3161. scrmode3DB=ChangeScreenMode3DB(modelist3DB);
  3162. #else
  3163. switch (scrmode3DB)
  3164. {
  3165. case 0: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[1]);break;
  3166. case 3: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[2]);break;
  3167. case 5: scrmode3DB=ChangeScreenMode3DB(&modelist3DB[0]);break;
  3168. }
  3169. #endif
  3170. main_buff=buff_3DB[scrmode3DB];
  3171. pal[3]=pal[4]=pal[5]=63;
  3172. pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  3173. SetPalette3DB(pal);
  3174. }
  3175. }
  3176. // Clear virtual buffer
  3177. void vclear(BYTE *buffpt,short w,short h,short bw,char fill)
  3178. {
  3179. short i;
  3180. for (i=0;i<h;i++)
  3181. {
  3182. memset(buffpt,fill,w);
  3183. buffpt+=bw;
  3184. }
  3185. }
  3186. // Clear buffer
  3187. void clearbuffer(buff_info *buffer,char fill)
  3188. {
  3189. vclear(buffer->buff_start,buffer->clip_wid,buffer->clip_hgt,buffer->buff_wid,fill);
  3190. }
  3191. // Copy buffer to current MCGA screen
  3192. void mcgacpy(BYTE *buffpt,short x,short y,short w,short h,short bw)
  3193. {
  3194. short i;
  3195. char *scrpt;
  3196. scrpt=(char *)0xa0000+x+320*y;
  3197. for (i=0;i<h;i++)
  3198. memcpy(scrpt,buffpt,w),buffpt+=bw,scrpt+=320;
  3199. }
  3200. // Copy buffer to current VESA screen
  3201. void svgacpy(BYTE *buffpt,short x,short y,short w,short h,short bw)
  3202. {
  3203. union REGS regs;
  3204. short i,co;
  3205. char *scrpt;
  3206. int scrdisp=x+Vbytesperline*y;
  3207. char bank=scrdisp/winrange;
  3208. if (w<1||h<1) return;
  3209. scrdisp%=winrange;
  3210. scrpt=(char *)0xa0000+scrdisp;
  3211. regs.x.eax=0x4f05;
  3212. regs.x.ebx=0;
  3213. regs.x.edx=bank;
  3214. int386(16,&regs,&regs);
  3215. do
  3216. {
  3217. co=min((winrange-scrdisp)/Vbytesperline,h);
  3218. for (i=0;i<co;i++)
  3219. {
  3220. memcpy(scrpt,buffpt,w);
  3221. scrpt+=Vbytesperline;
  3222. buffpt+=bw;
  3223. h--;
  3224. }
  3225. if (h)
  3226. {
  3227. scrdisp=(scrdisp+(co+1)*Vbytesperline)%winrange;
  3228. co=min(Vbytesperline-scrdisp,w);
  3229. memcpy(scrpt,buffpt,co);
  3230. bank++;
  3231. regs.x.eax=0x4f05;
  3232. regs.x.ebx=0;
  3233. regs.x.edx=bank;
  3234. int386(16,&regs,&regs);
  3235. if (co!=w)
  3236. memcpy((char *)0xa0000,buffpt+co,w-co);
  3237. scrpt=(char *)0xa0000+scrdisp;
  3238. buffpt+=bw;
  3239. h--;
  3240. }
  3241. }while (h);
  3242. regs.x.eax=0x4f05;
  3243. regs.x.ebx=0;
  3244. regs.x.edx=0;
  3245. int386(16,&regs,&regs);
  3246. }
  3247. /***********************/
  3248. /* BINARY SAVE ROUTINE */
  3249. int writebin(char *BinFile, BYTE *fPtr, int fLen)
  3250. {
  3251. int fHandle, fCount;
  3252. short fDone, fTry;
  3253. if ((fHandle = open((char *)BinFile, O_CREAT | O_RDWR | O_BINARY, S_IWRITE)) != -1)
  3254. {
  3255. fCount = fDone = fTry = 0;
  3256. while (fCount != fLen && fDone == fTry)
  3257. {
  3258. fTry = min(fLen - fCount, 32766);
  3259. fDone = write(fHandle, fPtr + fCount, fTry);
  3260. fCount += fDone;
  3261. }
  3262. if (fDone != fTry)
  3263. fCount = -1;
  3264. close(fHandle);
  3265. }
  3266. else
  3267. fCount = -1;
  3268. return (fCount);
  3269. }
  3270. BYTE *readbin(char *BinFile, BYTE *fPtr, dword *fLen)
  3271. {
  3272. int fHandle, fCount;
  3273. short fDone, fTry;
  3274. BYTE *fRes = fPtr;
  3275. if ((fHandle = open((char *)BinFile, O_RDONLY | O_BINARY)) != -1)
  3276. {
  3277. *fLen = filelength(fHandle);
  3278. if (fPtr != NULL || (fPtr = (BYTE *)mallocx(*fLen)) != NULL)
  3279. {
  3280. fCount = fDone = fTry = 0;
  3281. while (fCount != *fLen && fDone == fTry)
  3282. {
  3283. fTry = min(*fLen - fCount, 32766);
  3284. fDone = read(fHandle, fPtr + fCount, fTry);
  3285. fCount += fDone;
  3286. }
  3287. if (fDone != fTry)
  3288. {
  3289. if (fRes == NULL)
  3290. freex(fPtr);
  3291. fPtr = NULL;
  3292. }
  3293. }
  3294. close(fHandle);
  3295. }
  3296. else
  3297. fPtr = NULL;
  3298. return (fPtr);
  3299. }
  3300. BYTE *readrawfile(char *filename, BYTE *address)
  3301. {
  3302. BYTE *ptr;
  3303. dword len;
  3304. if ((ptr=readbin(filename, address, &len))==NULL)
  3305. printf("Error loading file %s\n",filename);
  3306. return (ptr);
  3307. }
  3308. #ifdef JAPAN
  3309. char datafile[]="actrend.dat";
  3310. char dataoffs[]="actrend.off";
  3311. char fapfile[]="fapj.dat";
  3312. char fapoffs[]="fapj.off";
  3313. #else
  3314. #ifndef FLOPPY
  3315. char datafile[]="actrend.dat";
  3316. char dataoffs[]="actrend.off";
  3317. char fapfile[]="fap.dat";
  3318. char fapoffs[]="fap.off";
  3319. #else
  3320. #ifndef BBS
  3321. char datafile[]="actrendf.dat";
  3322. char dataoffs[]="actrendf.off";
  3323. char fapfile[]="fapf.dat";
  3324. char fapoffs[]="fapf.off";
  3325. #else
  3326. char datafile[]="actrendb.dat";
  3327. char dataoffs[]="actrendb.off";
  3328. char fapfile[]="fapf.dat";
  3329. char fapoffs[]="fapf.off";
  3330. #endif
  3331. #endif
  3332. #endif
  3333. struct { int offset,size; } load_offsets[MAX_FILES];
  3334. FILE *fd;
  3335. int opendatafile(char *datafile)
  3336. {
  3337. fd=fopen(datafile, "rb");
  3338. if (fd==NULL)
  3339. {
  3340. puts("Can't find data file.");
  3341. return(-1);
  3342. }
  3343. return(0);
  3344. }
  3345. void closedatafile()
  3346. {
  3347. if (fd!=NULL)
  3348. fclose(fd);
  3349. fd=NULL;
  3350. }
  3351. BYTE *readdatafile(int fileno, BYTE *address)
  3352. {
  3353. BYTE *ptr;
  3354. int seek_pos,file_size;
  3355. seek_pos=load_offsets[fileno/8].offset;
  3356. file_size=load_offsets[fileno/8].size;
  3357. fseek(fd,seek_pos,SEEK_SET);
  3358. if (address==NULL)
  3359. { if ((ptr=(BYTE *)mallocx(file_size*sizeof(BYTE)))==NULL) return(NULL); }
  3360. else
  3361. ptr=address;
  3362. fread(ptr, sizeof(BYTE), file_size, fd);
  3363. return(ptr);
  3364. }
  3365. BYTE *readfile(int fileno, BYTE *address)
  3366. {
  3367. BYTE *ptr;
  3368. if ((ptr=readdatafile(fileno, address))==NULL)
  3369. printf("Error loading data file %d\n",fileno);
  3370. return (ptr);
  3371. }
  3372. BYTE *readdatafilesection(int fileno, BYTE *address, int start_offset, int section_size)
  3373. {
  3374. int seek_pos;
  3375. seek_pos=load_offsets[fileno/8].offset+start_offset;
  3376. fseek(fd,seek_pos,SEEK_SET);
  3377. fread(address, sizeof(BYTE), section_size, fd);
  3378. return (address);
  3379. }
  3380. BYTE *readfileblock(int fileno, int blockno, int blocks, BYTE *address)
  3381. {
  3382. int flen;
  3383. BYTE *ptr;
  3384. flen=load_offsets[fileno/8].size;
  3385. if ((ptr=readdatafilesection(fileno,address+flen*blockno/blocks,flen*blockno/blocks,flen*(blockno+1)/blocks-flen*blockno/blocks))==NULL)
  3386. printf("Error loading data file %d\n",fileno);
  3387. return (ptr);
  3388. }
  3389. #define FRM_WID 128
  3390. #define FRM_HGT 80
  3391. #define FRM_LEN (FRM_WID*FRM_HGT)
  3392. #define ANIM_SPACE 280000
  3393. //#define ANIM_SPACE 172000
  3394. char *anim_data;
  3395. int anim_start[]={0,10241,10241,10241,10241,10241,10241,10241,10241+91600,10241,10241+126777,10241,10241+127983};
  3396. char *buff_ptr;
  3397. typedef struct { int no,time;char *frmptr; } anim_info;
  3398. anim_info vidi;
  3399. int vidi_in,vidi_anim,vcount;
  3400. void
  3401. init_anim(anim_info &anim,int no)
  3402. {
  3403. int i;
  3404. // char *buffp=buff_ptr;
  3405. char *buffp=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  3406. char *animp;
  3407. anim.no=no;
  3408. anim.time=count;
  3409. animp=anim.frmptr=anim_data+anim_start[no];
  3410. for (i=0;i<FRM_HGT;i++)
  3411. {
  3412. memcpy(buffp,animp,FRM_WID);
  3413. buffp+=256;
  3414. animp+=FRM_WID;
  3415. }
  3416. anim.frmptr=animp;
  3417. }
  3418. void
  3419. stop_anim(anim_info &anim)
  3420. {
  3421. #ifdef AMERICA
  3422. readfile(COL_VR,(BYTE *)&pal[240*3]);
  3423. #else
  3424. readfile(COL_VIDI,(BYTE *)&pal[240*3]);
  3425. #endif
  3426. setpal();
  3427. init_anim(anim,0);
  3428. vidi_anim=0;
  3429. }
  3430. void
  3431. do_anim(anim_info &anim)
  3432. {
  3433. int i,j,ttime,tval,tlen;
  3434. int buffd=256-FRM_WID;
  3435. // char *buffp=buff_ptr;
  3436. char *buffp=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  3437. char *animp;
  3438. if (anim.no && (ttime=count)>anim.time+10)
  3439. if (!*anim.frmptr)
  3440. {
  3441. if (vidi_anim==7||vidi_anim==9||vidi_anim==11)
  3442. vidi_anim++;
  3443. init_anim(anim,vidi_anim);
  3444. }
  3445. else
  3446. {
  3447. if (--vcount<=0)
  3448. stop_anim(anim);
  3449. else
  3450. {
  3451. animp=anim.frmptr;
  3452. anim.time=ttime;
  3453. tlen=FRM_WID;
  3454. while (tval=*animp++)
  3455. {
  3456. while (tlen<tval)
  3457. {
  3458. tval-=tlen;
  3459. while (tlen--) (*buffp++) = (*animp++);
  3460. tlen=FRM_WID,buffp+=buffd;
  3461. }
  3462. tlen-=tval;
  3463. while (tval--) (*buffp++) = (*animp++);
  3464. tval=*animp++;
  3465. while (tlen<tval)
  3466. {
  3467. tval-=tlen;
  3468. while (tlen--) buffp++;
  3469. tlen=FRM_WID,buffp+=buffd;
  3470. }
  3471. tlen-=tval;
  3472. while (tval--) buffp++;
  3473. }
  3474. anim.frmptr=animp;
  3475. }
  3476. }
  3477. }
  3478. int spool;
  3479. void
  3480. do_extra_time_anim(int sp)
  3481. {
  3482. #ifdef FLOPPY
  3483. return;
  3484. #else
  3485. if (!setup.M8) return;
  3486. vidi_anim=1;
  3487. spool=sp;
  3488. if (spool==10||vidi_in==1)
  3489. {
  3490. spool=0;
  3491. readfile(COL_XET,(BYTE *)&pal[240*3]);
  3492. setpal();
  3493. vidi_in=1;
  3494. vcount=200;
  3495. init_anim(vidi,1);
  3496. return;
  3497. }
  3498. readfileblock(FAP_XET,spool,10,(BYTE *)anim_data+10241);
  3499. spool++;
  3500. #endif
  3501. }
  3502. void
  3503. do_foul_anim(int sp)
  3504. {
  3505. #ifdef FLOPPY
  3506. return;
  3507. #else
  3508. if (!setup.M8) return;
  3509. vidi_anim=2;
  3510. spool=sp;
  3511. if (spool==10||vidi_in==2)
  3512. {
  3513. spool=0;
  3514. readfile(COL_XFOU,(BYTE *)&pal[240*3]);
  3515. setpal();
  3516. vidi_in=2;
  3517. vcount=100;
  3518. init_anim(vidi,2);
  3519. return;
  3520. }
  3521. readfileblock(FAP_XFOU,spool,10,(BYTE *)anim_data+10241);
  3522. spool++;
  3523. #endif
  3524. }
  3525. void
  3526. do_full_time_anim(int sp)
  3527. {
  3528. #ifdef FLOPPY
  3529. return;
  3530. #else
  3531. if (!setup.M8) return;
  3532. vidi_anim=3;
  3533. spool=sp;
  3534. if (spool==10||vidi_in==3)
  3535. {
  3536. spool=0;
  3537. readfile(COL_XFT,(BYTE *)&pal[240*3]);
  3538. setpal();
  3539. vidi_in=3;
  3540. vcount=200;
  3541. init_anim(vidi,3);
  3542. return;
  3543. }
  3544. readfileblock(FAP_XFT,spool,10,(BYTE *)anim_data+10241);
  3545. spool++;
  3546. #endif
  3547. }
  3548. void
  3549. do_half_time_anim(int sp)
  3550. {
  3551. #ifdef FLOPPY
  3552. return;
  3553. #else
  3554. if (!setup.M8) return;
  3555. vidi_anim=4;
  3556. spool=sp;
  3557. if (spool==10||vidi_in==4)
  3558. {
  3559. spool=0;
  3560. readfile(COL_XHT,(BYTE *)&pal[240*3]);
  3561. setpal();
  3562. vidi_in=4;
  3563. vcount=300;
  3564. init_anim(vidi,4);
  3565. return;
  3566. }
  3567. readfileblock(FAP_XHT,spool,10,(BYTE *)anim_data+10241);
  3568. spool++;
  3569. #endif
  3570. }
  3571. void
  3572. do_penalty_anim(int sp)
  3573. {
  3574. #ifdef FLOPPY
  3575. return;
  3576. #else
  3577. if (!setup.M8) return;
  3578. vidi_anim=5;
  3579. spool=sp;
  3580. if (spool==10||vidi_in==5)
  3581. {
  3582. spool=0;
  3583. readfile(COL_XPEN,(BYTE *)&pal[240*3]);
  3584. setpal();
  3585. vidi_in=5;
  3586. vcount=100;
  3587. init_anim(vidi,5);
  3588. return;
  3589. }
  3590. readfileblock(FAP_XPEN,spool,10,(BYTE *)anim_data+10241);
  3591. spool++;
  3592. #endif
  3593. }
  3594. /*
  3595. void
  3596. do_goal_anim(int sp)
  3597. {
  3598. if (!setup.M8) return;
  3599. if (vidi_in!=6) readfile(FAP_XGOA,(BYTE *)anim_data+10241);
  3600. readfile(COL_XGOA,(BYTE *)&pal[240*3]);
  3601. setpal();
  3602. vidi_anim=vidi_in=6;
  3603. vcount=200;
  3604. init_anim(vidi,6);
  3605. }
  3606. */
  3607. void
  3608. do_goal_anim(int sp)
  3609. {
  3610. if (!setup.M8) return;
  3611. vidi_anim=6;
  3612. spool=sp;
  3613. if (spool==10||vidi_in==6)
  3614. {
  3615. spool=0;
  3616. //#ifndef BBS
  3617. // readfile(COL_BOOST,(BYTE *)&pal[240*3]);
  3618. //#else
  3619. readfile(COL_XGOA,(BYTE *)&pal[240*3]);
  3620. //#endif
  3621. setpal();
  3622. vidi_in=6;
  3623. vcount=200;
  3624. init_anim(vidi,6);
  3625. return;
  3626. }
  3627. //#ifndef BBS
  3628. // readfileblock(FAP_BOOST,spool,10,(BYTE *)anim_data+10241);
  3629. //#else
  3630. readfileblock(FAP_XGOA,spool,10,(BYTE *)anim_data+10241);
  3631. //#endif
  3632. spool++;
  3633. }
  3634. void
  3635. do_win_f_anim(int sp)
  3636. {
  3637. #ifdef FLOPPY
  3638. return;
  3639. #else
  3640. if (!setup.M8) return;
  3641. vidi_anim=7;
  3642. spool=sp;
  3643. if (spool==10||vidi_in==7)
  3644. {
  3645. spool=0;
  3646. readfile(COL_XWNF,(BYTE *)&pal[240*3]);
  3647. setpal();
  3648. vidi_in=7;
  3649. vcount=100000;
  3650. init_anim(vidi,7);
  3651. return;
  3652. }
  3653. readfileblock(FAP_XWNF1,spool,10,(BYTE *)anim_data+10241);
  3654. readfileblock(FAP_XWNF2,spool,10,(BYTE *)anim_data+10241+91600);
  3655. spool++;
  3656. #endif
  3657. }
  3658. void
  3659. do_win_g_anim(int sp)
  3660. {
  3661. #ifdef FLOPPY
  3662. return;
  3663. #else
  3664. if (!setup.M8) return;
  3665. vidi_anim=9;
  3666. spool=sp;
  3667. if (spool==10||vidi_in==9)
  3668. {
  3669. spool=0;
  3670. readfile(COL_XWNG,(BYTE *)&pal[240*3]);
  3671. setpal();
  3672. vidi_in=9;
  3673. vcount=100000;
  3674. init_anim(vidi,9);
  3675. return;
  3676. }
  3677. readfileblock(FAP_XWNG1,spool,10,(BYTE *)anim_data+10241);
  3678. readfileblock(FAP_XWNG2,spool,10,(BYTE *)anim_data+10241+126777);
  3679. spool++;
  3680. #endif
  3681. }
  3682. void
  3683. do_win_s_anim(int sp)
  3684. {
  3685. #ifdef FLOPPY
  3686. return;
  3687. #else
  3688. if (!setup.M8) return;
  3689. vidi_anim=11;
  3690. spool=sp;
  3691. if (spool==10||vidi_in==11)
  3692. {
  3693. spool=0;
  3694. readfile(COL_XWNS,(BYTE *)&pal[240*3]);
  3695. setpal();
  3696. vidi_in=11;
  3697. vcount=100000;
  3698. init_anim(vidi,11);
  3699. return;
  3700. }
  3701. readfileblock(FAP_XWNS1,spool,10,(BYTE *)anim_data+10241);
  3702. readfileblock(FAP_XWNS2,spool,10,(BYTE *)anim_data+10241+127983);
  3703. spool++;
  3704. #endif
  3705. }
  3706. /*********************/
  3707. /* IN-GAME FRONT END */
  3708. #if 0
  3709. texture_info IngameTextureDEFN={NULL,256,256};
  3710. pseudo_info IngamePseudoDEFN;
  3711. void InitSprites()
  3712. {
  3713. ReadDataOffsetFile(dataoffs); // Load data offset file.
  3714. Euro96_MemoryInitialise(); // Resets all Euro memory handles.
  3715. TextStringMemHandle = // Set up memory handle.
  3716. AllocateTextStringMemory(); // Allocate memory for text strings..
  3717. process_script_file("ingame.spt"); // Reads script file and compiles relevent data for game.
  3718. TexturePageMemHandle = // Set up memory handle.
  3719. AllocateTexturePageMemory( 1, // Specify number of texture pages to allocate.
  3720. &IngameTextureDEFN ); // Allocate memory for frontend texture pages.
  3721. IngameTextureDEFN.page_start = (BYTE *)TexturePages; // Specify memory address used for texture pages.
  3722. }
  3723. void LoadPage()
  3724. {
  3725. LoadTexturePage( BM_EXTRA1, // Load texture page 1 into texture memory.
  3726. datafile, 0,
  3727. &IngameTextureDEFN );
  3728. }
  3729. void UninitSprites()
  3730. {
  3731. DeAllocateMemory(TexturePageMemHandle); // DeAllocates memory used previously for textures.
  3732. DeAllocateMemory(TextStringMemHandle); // DeAllocates memory used previously for text strings.
  3733. }
  3734. #endif
  3735. #define NO_MENUS 24
  3736. buff_info menu_buff_l[NO_MENUS]=
  3737. {
  3738. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3739. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3740. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3741. {NULL, 320,64, 224,64, 0, 0, dumpnull},
  3742. {NULL, 320,64, 224,64, 0, 0, dumpnull},
  3743. {NULL, 320,64, 192,64, 0, 0, dumpnull},
  3744. {NULL, 320,64, 192,64, 0, 0, dumpnull},
  3745. {NULL, 320,64, 192,64, 0, 0, dumpnull},
  3746. {NULL, 320,64, 192,64, 0, 0, dumpnull},
  3747. {NULL, 320,64, 192,64, 0, 0, dumpnull},
  3748. {NULL, 320,64, 224,64, 0, 0, dumpnull},
  3749. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3750. {NULL, 320,128, 288,128, 0, 0, dumpnull},
  3751. {NULL, 320,128, 288,128, 0, 0, dumpnull},
  3752. {NULL, 320,128, 288,128, 0, 0, dumpnull},
  3753. {NULL, 320,128, 288,128, 0, 0, dumpnull},
  3754. {NULL, 320,128, 288,128, 0, 0, dumpnull},
  3755. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3756. {NULL, 320,128, 160,128, 0, 0, dumpnull},
  3757. {NULL, 320,112, 160,112, 0, 0, dumpnull},
  3758. {NULL, 320,128, 224,128, 0, 0, dumpnull},
  3759. {NULL, 320,80, 288,80, 0, 0, dumpnull},
  3760. // {NULL, 320,64, 224,64, 0, 0, dumpnull},
  3761. {NULL, 320,64, 320,64, 0, 0, dumpnull},
  3762. {NULL, 320,160, 256,160, 0, 0, dumpnull},
  3763. };
  3764. buff_info menu_buff_h[NO_MENUS]=
  3765. {
  3766. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3767. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3768. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3769. {NULL, 640,128, 448,128, 0, 0, dumpnull},
  3770. {NULL, 640,128, 448,128, 0, 0, dumpnull},
  3771. {NULL, 640,128, 384,128, 0, 0, dumpnull},
  3772. {NULL, 640,128, 384,128, 0, 0, dumpnull},
  3773. {NULL, 640,128, 384,128, 0, 0, dumpnull},
  3774. {NULL, 640,128, 384,128, 0, 0, dumpnull},
  3775. {NULL, 640,128, 384,128, 0, 0, dumpnull},
  3776. {NULL, 640,128, 448,128, 0, 0, dumpnull},
  3777. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3778. {NULL, 640,256, 576,256, 0, 0, dumpnull},
  3779. {NULL, 640,256, 576,256, 0, 0, dumpnull},
  3780. {NULL, 640,256, 576,256, 0, 0, dumpnull},
  3781. {NULL, 640,256, 576,256, 0, 0, dumpnull},
  3782. {NULL, 640,256, 576,256, 0, 0, dumpnull},
  3783. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3784. {NULL, 640,256, 320,256, 0, 0, dumpnull},
  3785. {NULL, 640,224, 320,224, 0, 0, dumpnull},
  3786. {NULL, 640,256, 448,256, 0, 0, dumpnull},
  3787. {NULL, 640,160, 576,160, 0, 0, dumpnull},
  3788. // {NULL, 640,128, 448,128, 0, 0, dumpnull},
  3789. {NULL, 640,128, 640,128, 0, 0, dumpnull},
  3790. {NULL, 640,320, 512,320, 0, 0, dumpnull},
  3791. };
  3792. struct mtime {
  3793. unsigned short min;
  3794. float secs;
  3795. };
  3796. extern mtime match_time;
  3797. extern int team_a_goals;
  3798. extern int team_b_goals;
  3799. extern goal_table goals[];
  3800. extern team_info game_data[2];
  3801. //extern match_data match_info;
  3802. extern match_player teams[22];
  3803. float slco;
  3804. int slide,oslide,mcount,menu,mhgt,rdmenu;
  3805. int mdata1,mdata2,mdata3;
  3806. void
  3807. draw_sprite(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  3808. {
  3809. int sd;
  3810. if (scrmode3DB>=0)
  3811. {
  3812. x+=menx3DB;
  3813. y+=meny3DB;
  3814. curpts3DB->x=x<<16;
  3815. curpts3DB->y=((render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16);
  3816. if (curpts3DB->y<0x10000)
  3817. {
  3818. sd=curpts3DB->y-0x10000;
  3819. curpts3DB->y=0x10000;
  3820. }
  3821. else
  3822. sd=0;
  3823. curpts3DB++;
  3824. curpts3DB->x=((x+spr_data[sprite_no].wid)<<16);
  3825. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  3826. if (curpts3DB->y<0) {curpts3DB--;return;}
  3827. curpts3DB++;
  3828. curtex3DB++;
  3829. (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  3830. curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  3831. curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  3832. (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  3833. curtex3DB++;
  3834. }
  3835. else
  3836. {
  3837. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  3838. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  3839. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  3840. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  3841. int ts=buff->buff_wid-w;
  3842. int ds=256-w;
  3843. int i,j;
  3844. BYTE c;
  3845. if (w<0||h<0) return;
  3846. for (i=0;i<h;i++)
  3847. {
  3848. for (j=0;j<w;j++)
  3849. {
  3850. c=*spd++;
  3851. if (c) if (!--c) *spt=col; else *spt=c;
  3852. spt++;
  3853. }
  3854. spt+=ts;
  3855. spd+=ds;
  3856. }
  3857. }
  3858. }
  3859. void
  3860. draw_sprite_d(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  3861. {
  3862. int sd;
  3863. if (scrmode3DB>=0)
  3864. {
  3865. x+=menx3DB;
  3866. y+=meny3DB;
  3867. curpts3DB->x=x<<16;
  3868. curpts3DB->y=(render_buff.clip_hgtl-(y+(spr_data[sprite_no].hgt<<1)))<<16;
  3869. if (curpts3DB->y<0x10000)
  3870. {
  3871. sd=curpts3DB->y-0x10000;
  3872. curpts3DB->y=0x10000;
  3873. }
  3874. else
  3875. sd=0;
  3876. curpts3DB++;
  3877. curpts3DB->x=(x+(spr_data[sprite_no].wid<<1))<<16;
  3878. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  3879. if (curpts3DB->y<0) {curpts3DB--;return;}
  3880. curpts3DB++;
  3881. curtex3DB++;
  3882. (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  3883. curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  3884. curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  3885. (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  3886. curtex3DB++;
  3887. }
  3888. else
  3889. {
  3890. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  3891. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  3892. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  3893. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  3894. int ts=buff->buff_wid-(w<<1);
  3895. int ds=256-w;
  3896. int i,j;
  3897. BYTE c;
  3898. if (w<0||h<0) return;
  3899. for (i=0;i<h;i++)
  3900. {
  3901. for (j=0;j<w;j++)
  3902. {
  3903. c=*spd++;
  3904. if (c) if (!--c) *spt=col; else *spt=c;
  3905. spt++;
  3906. if (c) if (!--c) *spt=col; else *spt=c;
  3907. spt++;
  3908. }
  3909. spt+=ts;
  3910. spd-=w;
  3911. for (j=0;j<w;j++)
  3912. {
  3913. c=*spd++;
  3914. if (c) if (!--c) *spt=col; else *spt=c;
  3915. spt++;
  3916. if (c) if (!--c) *spt=col; else *spt=c;
  3917. spt++;
  3918. }
  3919. spt+=ts;
  3920. spd+=ds;
  3921. }
  3922. }
  3923. }
  3924. void
  3925. draw_sprite_s(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  3926. {
  3927. int sd;
  3928. if (scrmode3DB>=0)
  3929. {
  3930. x+=menx3DB;
  3931. y+=meny3DB;
  3932. curpts3DB->x=x<<16;
  3933. curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  3934. if (curpts3DB->y<0x10000)
  3935. {
  3936. sd=curpts3DB->y-0x10000;
  3937. curpts3DB->y=0x10000;
  3938. }
  3939. else
  3940. sd=0;
  3941. curpts3DB++;
  3942. curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  3943. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  3944. if (curpts3DB->y<0) {curpts3DB--;return;}
  3945. curpts3DB++;
  3946. curtex3DB++;
  3947. (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  3948. curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  3949. curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  3950. (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  3951. curtex3DB++;
  3952. }
  3953. else
  3954. {
  3955. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  3956. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  3957. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  3958. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  3959. int ts=buff->buff_wid-w;
  3960. int ds=256-w;
  3961. int i,j;
  3962. BYTE c;
  3963. if (w<0||h<0) return;
  3964. for (i=0;i<h;i++)
  3965. {
  3966. for (j=0;j<w;j++)
  3967. {
  3968. c=*spd++;
  3969. if (--c) *spt=c;
  3970. spt++;
  3971. }
  3972. spt+=ts;
  3973. spd+=ds;
  3974. }
  3975. }
  3976. }
  3977. void
  3978. draw_sprite_vf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  3979. {
  3980. int sd;
  3981. if (scrmode3DB>=0)
  3982. {
  3983. x+=menx3DB;
  3984. y+=meny3DB;
  3985. curpts3DB->x=x<<16;
  3986. curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  3987. if (curpts3DB->y<0x10000)
  3988. {
  3989. sd=curpts3DB->y-0x10000;
  3990. curpts3DB->y=0x10000;
  3991. }
  3992. else
  3993. sd=0;
  3994. curpts3DB++;
  3995. curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  3996. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  3997. if (curpts3DB->y<0) {curpts3DB--;return;}
  3998. curpts3DB++;
  3999. curtex3DB++;
  4000. (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4001. (curtex3DB-1)->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y-1)<<16)-sd;
  4002. curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4003. curtex3DB->t=(curtex3DB-1)->t+((spr_data[sprite_no].hgt)<<16)+sd;
  4004. curtex3DB++;
  4005. }
  4006. else
  4007. {
  4008. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4009. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+(spr_data[sprite_no].hgt-1)*256;
  4010. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4011. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4012. int ts=buff->buff_wid-w;
  4013. int ds=256+w;
  4014. int i,j;
  4015. BYTE c;
  4016. for (i=0;i<h;i++)
  4017. {
  4018. for (j=0;j<w;j++)
  4019. {
  4020. c=*spd++;
  4021. if (c) if (!--c) *spt=col; else *spt=c;
  4022. spt++;
  4023. }
  4024. spt+=ts;
  4025. spd-=ds;
  4026. }
  4027. }
  4028. }
  4029. void
  4030. draw_sprite_r(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4031. {
  4032. int sd;
  4033. if (scrmode3DB>=0)
  4034. {
  4035. x+=menx3DB;
  4036. y+=meny3DB;
  4037. curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4038. curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4039. curpts3DB++;
  4040. curpts3DB->x=x<<16;
  4041. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4042. curpts3DB++;
  4043. curtex3DB++;
  4044. (curtex3DB-1)->s=0x1000000+((spr_data[sprite_no].x)<<16);
  4045. curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y+1)<<16);
  4046. curtex3DB->s=(curtex3DB-1)->s+((spr_data[sprite_no].wid+1)<<16);
  4047. (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16);
  4048. curtex3DB++;
  4049. }
  4050. else
  4051. {
  4052. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4053. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x;
  4054. BYTE *tspd;
  4055. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4056. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4057. int ts=buff->buff_wid-w;
  4058. int ds=256-w;
  4059. int i,j;
  4060. BYTE c;
  4061. if (w<0||h<0) return;
  4062. for (i=0;i<h;i++)
  4063. {
  4064. tspd=spd;
  4065. for (j=0;j<w;j++)
  4066. {
  4067. c=*spd;
  4068. spd+=256;
  4069. if (c) if (!--c) *spt=col; else *spt=c;
  4070. spt++;
  4071. }
  4072. spt+=ts;
  4073. spd=tspd+1;
  4074. }
  4075. }
  4076. }
  4077. void
  4078. draw_sprite_hf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4079. {
  4080. int sd;
  4081. if (scrmode3DB>=0)
  4082. {
  4083. x+=menx3DB;
  4084. y+=meny3DB;
  4085. curpts3DB->x=x<<16;
  4086. curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4087. if (curpts3DB->y<0x10000)
  4088. {
  4089. sd=curpts3DB->y-0x10000;
  4090. curpts3DB->y=0x10000;
  4091. }
  4092. else
  4093. sd=0;
  4094. curpts3DB++;
  4095. curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4096. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4097. if (curpts3DB->y<0) {curpts3DB--;return;}
  4098. curpts3DB++;
  4099. curtex3DB++;
  4100. curtex3DB->s=0x1000000+((spr_data[sprite_no].x-1)<<16);
  4101. curtex3DB->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y)<<16);
  4102. (curtex3DB-1)->s=curtex3DB->s+((spr_data[sprite_no].wid)<<16);
  4103. (curtex3DB-1)->t=curtex3DB->t+((spr_data[sprite_no].hgt+1)<<16)+sd;
  4104. curtex3DB++;
  4105. }
  4106. else
  4107. {
  4108. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4109. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+spr_data[sprite_no].wid-1;
  4110. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4111. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4112. int ts=buff->buff_wid-w;
  4113. int ds=256+w;
  4114. int i,j;
  4115. BYTE c;
  4116. for (i=0;i<h;i++)
  4117. {
  4118. for (j=0;j<w;j++)
  4119. {
  4120. c=*spd--;
  4121. if (c) if (!--c) *spt=col; else *spt=c;
  4122. spt++;
  4123. }
  4124. spt+=ts;
  4125. spd+=ds;
  4126. }
  4127. }
  4128. }
  4129. void
  4130. draw_sprite_vhf(buff_info *buff,int sprite_no,int x,int y,BYTE col)
  4131. {
  4132. int sd;
  4133. if (scrmode3DB>=0)
  4134. {
  4135. x+=menx3DB;
  4136. y+=meny3DB;
  4137. curpts3DB->x=x<<16;
  4138. curpts3DB->y=(render_buff.clip_hgtl-(y+spr_data[sprite_no].hgt))<<16;
  4139. if (curpts3DB->y<0x10000)
  4140. {
  4141. sd=curpts3DB->y-0x10000;
  4142. curpts3DB->y=0x10000;
  4143. }
  4144. else
  4145. sd=0;
  4146. curpts3DB++;
  4147. curpts3DB->x=(x+spr_data[sprite_no].wid)<<16;
  4148. curpts3DB->y=(render_buff.clip_hgtl-y)<<16;
  4149. if (curpts3DB->y<0) {curpts3DB--;return;}
  4150. curpts3DB++;
  4151. curtex3DB++;
  4152. curtex3DB->s=0x1000000+((spr_data[sprite_no].x-1)<<16);
  4153. (curtex3DB-1)->t=0x2000000+(spr_data[sprite_no].page<<24)+((spr_data[sprite_no].y-1)<<16)-sd;
  4154. (curtex3DB-1)->s=curtex3DB->s+((spr_data[sprite_no].wid)<<16);
  4155. curtex3DB->t=(curtex3DB-1)->t+((spr_data[sprite_no].hgt)<<16)+sd;
  4156. curtex3DB++;
  4157. }
  4158. else
  4159. {
  4160. BYTE *spt=buff->buff_start+y*buff->buff_wid+x;
  4161. BYTE *spd=maps[X_BM+spr_data[sprite_no].page]+spr_data[sprite_no].y*256+spr_data[sprite_no].x+(spr_data[sprite_no].hgt-1)*256+spr_data[sprite_no].wid-1;
  4162. int w=min(spr_data[sprite_no].wid,buff->clip_wid-x);
  4163. int h=min(spr_data[sprite_no].hgt,buff->clip_hgt-y);
  4164. int ts=buff->buff_wid-w;
  4165. int ds=256-w;
  4166. int i,j;
  4167. BYTE c;
  4168. for (i=0;i<h;i++)
  4169. {
  4170. for (j=0;j<w;j++)
  4171. {
  4172. c=*spd--;
  4173. if (c) if (!--c) *spt=col; else *spt=c;
  4174. spt++;
  4175. }
  4176. spt+=ts;
  4177. spd-=ds;
  4178. }
  4179. }
  4180. }
  4181. int
  4182. string_len(int font_no,char *string)
  4183. {
  4184. BYTE c;
  4185. int len=0;
  4186. while (c=*string++)
  4187. {
  4188. if (c==' ') c=';';
  4189. if (c=='.') c='@';
  4190. if (c==',') c='?';
  4191. if (c=='>') c='A';
  4192. if (c>='a'&&c<='z') c-=32;
  4193. if (c=='O') c='0';
  4194. if (c=='&') c='O';
  4195. c-=48;
  4196. len+=font_data[font_no].prp[c]+1;
  4197. }
  4198. return(len);
  4199. }
  4200. int
  4201. draw_string(buff_info *buff,int font_no,int x,int y,char *string,BYTE col,short just)
  4202. {
  4203. BYTE c,ec;
  4204. int len;
  4205. len=string_len(font_no,string);
  4206. switch (just)
  4207. {
  4208. case 1:
  4209. x-=len;
  4210. break;
  4211. case 2:
  4212. x-=len>>1;
  4213. break;
  4214. }
  4215. while (c=*string++)
  4216. {
  4217. if (c==' ') c=';';
  4218. if (c=='.') c='@';
  4219. if (c==',') c='?';
  4220. if (c=='>')
  4221. {
  4222. c-=48;
  4223. ec=c+font_data[font_no].off;
  4224. spr_data[0].page=font_data[font_no].page;
  4225. spr_data[0].x=font_data[font_no].x+font_data[font_no].wid*(ec%font_data[font_no].n);
  4226. spr_data[0].y=font_data[font_no].y+font_data[font_no].hgt*(ec/font_data[font_no].n);
  4227. spr_data[0].wid=font_data[font_no].prp[c];
  4228. spr_data[0].hgt=font_data[font_no].hgt;
  4229. draw_sprite(buff,0,x,y-font_data[font_no].hgt,col);
  4230. c='A';
  4231. }
  4232. if (c>='a'&&c<='z') c-=32;
  4233. if (c=='O') c='0';
  4234. if (c=='&') c='O';
  4235. c-=48;
  4236. ec=c+font_data[font_no].off;
  4237. spr_data[0].page=font_data[font_no].page;
  4238. spr_data[0].x=font_data[font_no].x+font_data[font_no].wid*(ec%font_data[font_no].n);
  4239. spr_data[0].y=font_data[font_no].y+font_data[font_no].hgt*(ec/font_data[font_no].n);
  4240. spr_data[0].wid=font_data[font_no].prp[c];
  4241. spr_data[0].hgt=font_data[font_no].hgt;
  4242. draw_sprite(buff,0,x,y,col);
  4243. x+=font_data[font_no].prp[c]+1;
  4244. }
  4245. return (len);
  4246. }
  4247. void rectshadow3DB(buff_info *buff,int x,int y,int w,int h)
  4248. {
  4249. int tx,tw,i,j,c,d;
  4250. while (h>=62)
  4251. {
  4252. tx=x;
  4253. tw=w;
  4254. while (w>=64)
  4255. {
  4256. draw_sprite(buff,93,x,y,0);
  4257. x+=64;
  4258. w-=64;
  4259. }
  4260. for (i=0,c=32;i<5;i++,c>>=1)
  4261. if (w&c)
  4262. {
  4263. draw_sprite(buff,94+i,x,y,0);
  4264. x+=c;
  4265. }
  4266. x=tx;
  4267. w=tw;
  4268. h-=62;
  4269. y+=62;
  4270. }
  4271. for (i=0,c=32;i<5;i++,c>>=1)
  4272. if (h&c)
  4273. {
  4274. tx=x;
  4275. tw=w;
  4276. while (w>=64)
  4277. {
  4278. draw_sprite(buff,99+i*6,x,y,0);
  4279. x+=64;
  4280. w-=64;
  4281. }
  4282. for (j=0,d=32;j<5;j++,d>>=1)
  4283. if (w&d)
  4284. {
  4285. draw_sprite(buff,100+i*6+j,x,y,0);
  4286. x+=d;
  4287. }
  4288. x=tx;
  4289. w=tw;
  4290. h-=c;
  4291. y+=c;
  4292. }
  4293. }
  4294. void
  4295. draw_menu_box(buff_info *buff)
  4296. {
  4297. short f,w,wd,hd;
  4298. BYTE *col=filters[0];
  4299. BYTE *sc;
  4300. if (scrmode!=0x13)
  4301. {
  4302. if ((hd=min(buff->buff_hgt-(19+32)*2,buff->clip_hgt-19-32))>0)
  4303. if (scrmode3DB<0)
  4304. {
  4305. wd=buff->clip_wid-20*2;
  4306. sc=buff->buff_start+(19+32)*buff->buff_wid+20;
  4307. for (f=hd;f;f--)
  4308. {
  4309. w=wd;
  4310. do {*sc=col[*sc];sc++;} while (--w);
  4311. sc+=render_buff.buff_wid-wd;
  4312. }
  4313. }
  4314. else
  4315. rectshadow3DB(buff,20,19+32,buff->clip_wid-20*2,hd);
  4316. draw_sprite(buff,21,11,10+32,0);
  4317. draw_sprite_hf(buff,21,buff->clip_wid-32,10+32,0);
  4318. draw_sprite_vhf(buff,21,buff->clip_wid-32,buff->buff_hgt-32-32,0);
  4319. draw_sprite_vf(buff,21,11,buff->buff_hgt-32-32,0);
  4320. for (f=32;f<buff->clip_wid-32;f+=32)
  4321. {
  4322. draw_sprite(buff,22,f,10+32,0);
  4323. draw_sprite(buff,22,f,buff->buff_hgt-19-32,0);
  4324. }
  4325. for (f=32+32;f<buff->buff_hgt-32-32;f+=32)
  4326. {
  4327. draw_sprite(buff,23,11,f,0);
  4328. draw_sprite(buff,23,buff->clip_wid-20,f,0);
  4329. }
  4330. }
  4331. else
  4332. {
  4333. if ((hd=min(buff->buff_hgt-(10+16)*2,buff->clip_hgt-10-16))>0)
  4334. if (scrmode3DB<0)
  4335. {
  4336. wd=buff->clip_wid-10*2;
  4337. sc=buff->buff_start+(10+16)*buff->buff_wid+10;
  4338. for (f=hd;f;f--)
  4339. {
  4340. w=wd;
  4341. do {*sc=col[*sc];sc++;} while (--w);
  4342. sc+=render_buff.buff_wid-wd;
  4343. }
  4344. }
  4345. else
  4346. rectshadow3DB(buff,10,10+16,buff->clip_wid-10*2,hd);
  4347. draw_sprite(buff,32,5,5+16,0);
  4348. draw_sprite_hf(buff,32,buff->clip_wid-16,5+16,0);
  4349. draw_sprite_vhf(buff,32,buff->clip_wid-16,buff->buff_hgt-16-16,0);
  4350. draw_sprite_vf(buff,32,5,buff->buff_hgt-16-16,0);
  4351. for (f=16;f<buff->clip_wid-16;f+=32)
  4352. {
  4353. draw_sprite(buff,33,f,5+16,0);
  4354. draw_sprite(buff,33,f,buff->buff_hgt-10-16,0);
  4355. }
  4356. for (f=16+16;f<buff->buff_hgt-32-16;f+=32)
  4357. {
  4358. draw_sprite(buff,34,5,f,0);
  4359. draw_sprite(buff,34,buff->clip_wid-10,f,0);
  4360. }
  4361. if (f<buff->buff_hgt-16-16)
  4362. {
  4363. draw_sprite(buff,83,5,f,0);
  4364. draw_sprite(buff,83,buff->clip_wid-10,f,0);
  4365. }
  4366. }
  4367. }
  4368. void
  4369. goal_menu(buff_info *buff, int team, int player, int time)
  4370. {
  4371. int shirt;
  4372. if (!team)
  4373. shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4374. else
  4375. shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4376. draw_menu_box(buff);
  4377. if (scrmode==0x13)
  4378. {
  4379. draw_sprite(buff,30+team,10,11,0);
  4380. draw_sprite(buff,2+shirt,16,21,0);
  4381. draw_string(buff,0,160,30, GetTEXT( GLSC_TEXT ) ,207,1);
  4382. if (!team)
  4383. draw_string(buff,0,160,30,
  4384. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4385. 31,0);
  4386. else
  4387. draw_string(buff,0,160,30,
  4388. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4389. 31,0);
  4390. draw_sprite(buff,40,278,18,0);
  4391. }
  4392. else
  4393. {
  4394. draw_sprite(buff,19+team,20,24,0);
  4395. draw_string(buff,2,320,56, GetTEXT( GLSC_TEXT ),207,1);
  4396. if (!team)
  4397. {
  4398. draw_sprite_s(buff,53+shirt,42,51,0);
  4399. draw_string(buff,2,320,56,
  4400. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4401. 31,0);
  4402. }
  4403. else
  4404. {
  4405. draw_sprite_s(buff,68+shirt,42,51,0);
  4406. draw_string(buff,2,320,56,
  4407. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4408. 31,0);
  4409. }
  4410. draw_sprite(buff,29,556,38,0);
  4411. }
  4412. }
  4413. void
  4414. booked_menu(buff_info *buff, int team, int player)
  4415. {
  4416. int shirt;
  4417. if (!team)
  4418. shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4419. else
  4420. shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4421. draw_menu_box(buff);
  4422. if (scrmode==0x13)
  4423. {
  4424. draw_sprite(buff,30+team,10,11,0);
  4425. draw_sprite(buff,2+shirt,16,21,0);
  4426. draw_string(buff,0,160,30,GetTEXT( YLCD_TEXT ),157,1);
  4427. if (!team)
  4428. draw_string(buff,0,160,30,
  4429. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4430. 31,0);
  4431. else
  4432. draw_string(buff,0,160,30,
  4433. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4434. 31,0);
  4435. draw_sprite(buff,51,276,9,0);
  4436. draw_sprite(buff,52,276,11,0);
  4437. }
  4438. else
  4439. {
  4440. draw_sprite(buff,19+team,20,24,0);
  4441. draw_string(buff,2,320,56,GetTEXT( YLCD_TEXT ),157,1);
  4442. if (!team)
  4443. {
  4444. draw_sprite_s(buff,53+shirt,42,51,0);
  4445. draw_string(buff,2,320,56,
  4446. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4447. 31,0);
  4448. }
  4449. else
  4450. {
  4451. draw_sprite_s(buff,68+shirt,42,51,0);
  4452. draw_string(buff,2,320,56,
  4453. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4454. 31,0);
  4455. }
  4456. draw_sprite(buff,45,552,18,0);
  4457. draw_sprite(buff,46,552,24,0);
  4458. }
  4459. }
  4460. void
  4461. off_menu(buff_info *buff, int team, int player)
  4462. {
  4463. int shirt;
  4464. if (!team)
  4465. shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4466. else
  4467. shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4468. draw_menu_box(buff);
  4469. if (scrmode==0x13)
  4470. {
  4471. draw_sprite(buff,30+team,10,11,0);
  4472. draw_sprite(buff,2+shirt,16,21,0);
  4473. draw_string(buff,0,160,30,GetTEXT( RDCD_TEXT ),127,1);
  4474. if (!team)
  4475. draw_string(buff,0,160,30,
  4476. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4477. 31,0);
  4478. else
  4479. draw_string(buff,0,160,30,
  4480. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4481. 31,0);
  4482. draw_sprite(buff,50,276,9,0);
  4483. draw_sprite(buff,52,276,11,0);
  4484. }
  4485. else
  4486. {
  4487. draw_sprite(buff,19+team,20,24,0);
  4488. draw_string(buff,2,320,56,GetTEXT( RDCD_TEXT ),127,1);
  4489. if (!team)
  4490. {
  4491. draw_sprite_s(buff,53+shirt,42,51,0);
  4492. draw_string(buff,2,320,56,
  4493. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4494. 31,0);
  4495. }
  4496. else
  4497. {
  4498. draw_sprite_s(buff,68+shirt,42,51,0);
  4499. draw_string(buff,2,320,56,
  4500. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4501. 31,0);
  4502. }
  4503. draw_sprite(buff,44,552,18,0);
  4504. draw_sprite(buff,46,552,24,0);
  4505. }
  4506. }
  4507. void
  4508. direct_menu(buff_info *buff, int team)
  4509. {
  4510. draw_menu_box(buff);
  4511. if (scrmode==0x13)
  4512. {
  4513. draw_sprite(buff,30+team,10,11,0);
  4514. draw_string(buff,0,112,30,GetTEXT( DRKC_TEXT ),31,2);
  4515. draw_sprite(buff,52,188,11,0);
  4516. }
  4517. else
  4518. {
  4519. draw_sprite(buff,19+team,20,24,0);
  4520. draw_string(buff,2,224,56,GetTEXT( DRKC_TEXT ),31,2);
  4521. draw_sprite(buff,46,376,24,0);
  4522. }
  4523. }
  4524. void
  4525. indirect_menu(buff_info *buff, int team)
  4526. {
  4527. draw_menu_box(buff);
  4528. if (scrmode==0x13)
  4529. {
  4530. draw_sprite(buff,30+team,10,11,0);
  4531. draw_string(buff,0,112,30,GetTEXT( IDKC_TEXT ),31,2);
  4532. draw_sprite(buff,52,188,11,0);
  4533. }
  4534. else
  4535. {
  4536. draw_sprite(buff,19+team,20,24,0);
  4537. draw_string(buff,2,224,56,GetTEXT( IDKC_TEXT ),31,2);
  4538. draw_sprite(buff,46,376,24,0);
  4539. }
  4540. }
  4541. void
  4542. penalty_menu(buff_info *buff, int team)
  4543. {
  4544. draw_menu_box(buff);
  4545. if (scrmode==0x13)
  4546. {
  4547. draw_sprite(buff,30+team,10,11,0);
  4548. draw_string(buff,0,96,30,GetTEXT( PENK_TEXT ),31,2);
  4549. draw_sprite(buff,52,151,11,0);
  4550. }
  4551. else
  4552. {
  4553. draw_sprite(buff,19+team,20,24,0);
  4554. draw_string(buff,2,192,56,GetTEXT( PENK_TEXT ),31,2);
  4555. draw_sprite(buff,46,302,24,0);
  4556. }
  4557. }
  4558. void
  4559. corner_menu(buff_info *buff, int team)
  4560. {
  4561. draw_menu_box(buff);
  4562. if (scrmode==0x13)
  4563. {
  4564. draw_sprite(buff,30+team,10,11,0);
  4565. draw_string(buff,0,96,30,GetTEXT( CORK_TEXT ),31,2);
  4566. draw_sprite(buff,40,151,18,0);
  4567. }
  4568. else
  4569. {
  4570. draw_sprite(buff,19+team,20,24,0);
  4571. draw_string(buff,2,192,56,GetTEXT( CORK_TEXT ),31,2);
  4572. draw_sprite(buff,29,302,38,0);
  4573. }
  4574. }
  4575. void
  4576. throw_menu(buff_info *buff, int team)
  4577. {
  4578. draw_menu_box(buff);
  4579. if (scrmode==0x13)
  4580. {
  4581. draw_sprite(buff,30+team,10,11,0);
  4582. draw_string(buff,0,96,30,GetTEXT( THIN_TEXT ),31,2);
  4583. draw_sprite(buff,40,151,18,0);
  4584. }
  4585. else
  4586. {
  4587. draw_sprite(buff,19+team,20,24,0);
  4588. draw_string(buff,2,192,56,GetTEXT( THIN_TEXT ),31,2);
  4589. draw_sprite(buff,29,302,38,0);
  4590. }
  4591. }
  4592. void
  4593. goalkick_menu(buff_info *buff, int team)
  4594. {
  4595. draw_menu_box(buff);
  4596. if (scrmode==0x13)
  4597. {
  4598. draw_sprite(buff,30+team,10,11,0);
  4599. draw_string(buff,0,96,30,GetTEXT( GKIK_TEXT ),31,2);
  4600. draw_sprite(buff,40,151,18,0);
  4601. }
  4602. else
  4603. {
  4604. draw_sprite(buff,19+team,20,24,0);
  4605. draw_string(buff,2,192,56,GetTEXT( GKIK_TEXT ),31,2);
  4606. draw_sprite(buff,29,302,38,0);
  4607. }
  4608. }
  4609. void
  4610. kickoff_menu(buff_info *buff, int team)
  4611. {
  4612. draw_menu_box(buff);
  4613. if (scrmode==0x13)
  4614. {
  4615. draw_sprite(buff,30+team,10,11,0);
  4616. draw_string(buff,0,96,30,GetTEXT( KIOF_TEXT ),31,2);
  4617. draw_sprite(buff,40,151,18,0);
  4618. }
  4619. else
  4620. {
  4621. draw_sprite(buff,19+team,20,24,0);
  4622. draw_string(buff,2,192,56,GetTEXT( KIOF_TEXT ),31,2);
  4623. draw_sprite(buff,29,302,38,0);
  4624. }
  4625. }
  4626. void
  4627. offside_menu(buff_info *buff, int team)
  4628. {
  4629. draw_menu_box(buff);
  4630. if (scrmode==0x13)
  4631. {
  4632. draw_sprite(buff,30+team,10,11,0);
  4633. draw_string(buff,0,112,30,GetTEXT( OFFS_TEXT ),31,2);
  4634. draw_sprite(buff,52,188,11,0);
  4635. }
  4636. else
  4637. {
  4638. draw_sprite(buff,19+team,20,24,0);
  4639. draw_string(buff,2,224,56,GetTEXT( OFFS_TEXT ),31,2);
  4640. draw_sprite(buff,46,376,24,0);
  4641. }
  4642. }
  4643. void
  4644. injured_menu(buff_info *buff, int team, int player)
  4645. {
  4646. int shirt;
  4647. if (!team)
  4648. shirt=ppt[player+((match_half&1)?11:0)].number-1;
  4649. else
  4650. shirt=ppt[player+((match_half&1)?0:11)].number-1;
  4651. draw_menu_box(buff);
  4652. if (scrmode==0x13)
  4653. {
  4654. draw_sprite(buff,30+team,10,11,0);
  4655. draw_sprite(buff,2+shirt,16,21,0);
  4656. draw_string(buff,0,160,30,GetTEXT( PLIN_TEXT ),127,1);
  4657. if (!team)
  4658. draw_string(buff,0,160,30,
  4659. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4660. 31,0);
  4661. else
  4662. draw_string(buff,0,160,30,
  4663. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4664. 31,0);
  4665. draw_sprite(buff,52,280,11,0);
  4666. }
  4667. else
  4668. {
  4669. draw_sprite(buff,19+team,20,24,0);
  4670. draw_string(buff,2,320,56,GetTEXT( PLIN_TEXT ),127,1);
  4671. if (!team)
  4672. {
  4673. draw_sprite_s(buff,53+shirt,42,51,0);
  4674. draw_string(buff,2,320,56,
  4675. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  4676. 31,0);
  4677. }
  4678. else
  4679. {
  4680. draw_sprite_s(buff,68+shirt,42,51,0);
  4681. draw_string(buff,2,320,56,
  4682. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  4683. 31,0);
  4684. }
  4685. draw_sprite(buff,46,560,24,0);
  4686. }
  4687. }
  4688. extern referee_info referee_data[];
  4689. void
  4690. ref_menu(buff_info *buff)
  4691. {
  4692. char tlstr[50];
  4693. int ln;
  4694. draw_menu_box(buff);
  4695. if (scrmode==0x13)
  4696. {
  4697. draw_sprite(buff,52,13,11,0);
  4698. draw_string(buff,0,160,30,GetTEXT( RFRE_TEXT ),207,1);
  4699. strcpy(tlstr, EUROmatch_info.RefsName );
  4700. // strcat(tlstr," = ");
  4701. // strcat(tlstr,game_data[ referee_data[match_info.match_referee].country ].Nickname);
  4702. draw_string(buff,0,160,30,tlstr,31,0);
  4703. draw_sprite(buff,52,284,11,0);
  4704. }
  4705. else
  4706. {
  4707. draw_sprite(buff,46,26,24,0);
  4708. draw_string(buff,2,320,56,GetTEXT( RFRE_TEXT ),207,1);
  4709. strcpy(tlstr, EUROmatch_info.RefsName );
  4710. // strcat(tlstr," = ");
  4711. // strcat(tlstr,game_data[ referee_data[match_info.match_referee].country ].Nickname);
  4712. draw_string(buff,2,320,56,tlstr,31,0);
  4713. draw_sprite(buff,46,578,24,0);
  4714. }
  4715. }
  4716. void GOAL_SCORED( int team, int scorer, int time )
  4717. {
  4718. int goal_slot = -1;
  4719. int goal_count = 0;
  4720. // FIND AN EMPTY GOAL SLOT WITHIN GOAL DATA...
  4721. while ( goal_slot==-1 )
  4722. {
  4723. if ( goals[goal_count].goal_data.used == NULL )
  4724. {
  4725. goal_slot = goal_count;
  4726. goals[goal_slot].goal_data.used = ACTIVE;
  4727. }
  4728. else
  4729. {
  4730. goal_count++;
  4731. if ( goal_count>90 )
  4732. {
  4733. goals[0].goal_data.used = NULL;
  4734. goal_count = 0;
  4735. }
  4736. }
  4737. }
  4738. goals[goal_slot].goal_data.time = time+1;
  4739. // CALCULATE NORMAL GOAL....
  4740. if ( (time & O_G)==0 )
  4741. {
  4742. if ( scorer<11 )
  4743. {
  4744. goals[goal_slot].goal_data.scorer = game_data[TEMPa].players[scorer].squad_number; //was scorer-1
  4745. goals[goal_slot].goal_data.used|= CREDIT_TEAMa;
  4746. EUROmatch_info.Team_A_goals++;
  4747. }
  4748. else
  4749. {
  4750. goals[goal_slot].goal_data.scorer = game_data[TEMPb].players[scorer-11].squad_number; //was scorer-12
  4751. goals[goal_slot].goal_data.used|= CREDIT_TEAMb;
  4752. EUROmatch_info.Team_B_goals++;
  4753. }
  4754. }
  4755. // CALCULATE OWN GOAL....
  4756. if ( (time & O_G)!=0 )
  4757. {
  4758. goals[goal_slot].goal_data.used = O_G >> 8;
  4759. if ( scorer<11 )
  4760. {
  4761. goals[goal_slot].goal_data.scorer = game_data[TEMPa].players[scorer].squad_number; //was scorer-1
  4762. goals[goal_slot].goal_data.used|= CREDIT_TEAMb;
  4763. EUROmatch_info.Team_B_goals++;
  4764. }
  4765. else
  4766. {
  4767. goals[goal_slot].goal_data.scorer = game_data[TEMPb].players[scorer-11].squad_number; //was scorer-12
  4768. goals[goal_slot].goal_data.used|= CREDIT_TEAMa;
  4769. EUROmatch_info.Team_A_goals++;
  4770. }
  4771. }
  4772. }
  4773. void
  4774. score_breakdown_l(buff_info *buff)
  4775. {
  4776. int g,gc;
  4777. int l;
  4778. int m;
  4779. char tstr[50];
  4780. g=0;
  4781. m=52;
  4782. while (goals[g].goal_data.used)
  4783. {
  4784. if ((goals[g].goal_data.used&5)==4)
  4785. {
  4786. l=0;
  4787. if (!(goals[g].goal_data.time&512))
  4788. {
  4789. for (int sf=0;sf<22;sf++)
  4790. if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4791. sprintf(tstr,"%s ",
  4792. // &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  4793. &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  4794. }
  4795. else
  4796. {
  4797. for (int sf=0;sf<22;sf++)
  4798. if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4799. sprintf(tstr,"%s ",
  4800. // &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  4801. &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  4802. }
  4803. l+=draw_string(buff,0,l+40,m,tstr,157,0);
  4804. gc=g;
  4805. do {
  4806. if (goals[gc].goal_data.time&768)
  4807. {
  4808. if (l>=50) if ((m+=8,l=0)>52+5*8) goto mend1;
  4809. //-------------------------------------------------------------------------------
  4810. // if (EUROmatch_info.language!=2)
  4811. // if (goals[gc].goal_data.time&256)
  4812. // sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  4813. // else
  4814. // sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  4815. // else
  4816. // if (goals[gc].goal_data.time&256)
  4817. // sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  4818. // else
  4819. // sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  4820. //-------------------------------------------------------------------------------
  4821. // replaces above code... Forget about translations, new code will handle it.
  4822. if (goals[gc].goal_data.time&256)
  4823. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  4824. else
  4825. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  4826. }
  4827. else
  4828. {
  4829. if (l>=78) if ((m+=8,l=0)>52+5*8) goto mend1;
  4830. sprintf(tstr,"%d",goals[gc].goal_data.time);
  4831. }
  4832. l+=draw_string(buff,0,l+40,m,tstr,157,0);
  4833. goals[gc].goal_data.used|=1;
  4834. do {
  4835. gc++;
  4836. if ((goals[gc].goal_data.used&5)==4 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  4837. {
  4838. l+=draw_string(buff,0,l+40,m,",",157,0);
  4839. break;
  4840. }
  4841. } while (goals[gc].goal_data.used);
  4842. } while (goals[gc].goal_data.used);
  4843. if ((m+=8)>52+5*8) goto mend1;
  4844. }
  4845. g++;
  4846. }
  4847. mend1:;
  4848. mhgt=((m+40)>>4)<<4;
  4849. g=0;
  4850. m=52;
  4851. while (goals[g].goal_data.used)
  4852. {
  4853. if ((goals[g].goal_data.used&9)==8)
  4854. {
  4855. l=0;
  4856. if (!(goals[g].goal_data.time&512))
  4857. {
  4858. for (int sf=0;sf<22;sf++)
  4859. if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4860. sprintf(tstr,"%s ",
  4861. // &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  4862. &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  4863. }
  4864. else
  4865. {
  4866. for (int sf=0;sf<22;sf++)
  4867. if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4868. sprintf(tstr,"%s ",
  4869. // &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  4870. &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  4871. }
  4872. l+=draw_string(buff,0,l+178,m,tstr,157,0);
  4873. gc=g;
  4874. do {
  4875. if (goals[gc].goal_data.time&768)
  4876. {
  4877. if (l>=50) if ((m+=8,l=0)>52+5*8) goto mend2;
  4878. //-------------------------------------------------------------------------------
  4879. // if (match_info.language!=2)
  4880. // if (goals[gc].goal_data.time&256)
  4881. // sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  4882. // else
  4883. // sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  4884. // else
  4885. // if (goals[gc].goal_data.time&256)
  4886. // sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  4887. // else
  4888. // sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  4889. //-------------------------------------------------------------------------------
  4890. // replaces above code... Forget about translations, new code will handle it.
  4891. if (goals[gc].goal_data.time&256)
  4892. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  4893. else
  4894. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  4895. }
  4896. else
  4897. {
  4898. if (l>=78) if ((m+=8,l=0)>52+5*8) goto mend2;
  4899. sprintf(tstr,"%d",goals[gc].goal_data.time);
  4900. }
  4901. l+=draw_string(buff,0,l+178,m,tstr,157,0);
  4902. goals[gc].goal_data.used|=1;
  4903. do {
  4904. gc++;
  4905. if ((goals[gc].goal_data.used&9)==8 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  4906. {
  4907. l+=draw_string(buff,0,l+178,m,",",157,0);
  4908. break;
  4909. }
  4910. } while (goals[gc].goal_data.used);
  4911. } while (goals[gc].goal_data.used);
  4912. if ((m+=8)>52+5*8) goto mend2;
  4913. }
  4914. g++;
  4915. }
  4916. mend2:;
  4917. if (mhgt<((m+40)>>4)<<4) mhgt=((m+40)>>4)<<4;
  4918. gc=0;
  4919. while (goals[gc].goal_data.used)
  4920. goals[gc++].goal_data.used&=0xfe;
  4921. }
  4922. void
  4923. score_breakdown_h(buff_info *buff)
  4924. {
  4925. int g,gc;
  4926. int l;
  4927. int m;
  4928. char tstr[50];
  4929. g=0;
  4930. m=104;
  4931. while (goals[g].goal_data.used)
  4932. {
  4933. if ((goals[g].goal_data.used&5)==4)
  4934. {
  4935. l=0;
  4936. if (!(goals[g].goal_data.time&512))
  4937. {
  4938. for (int sf=0;sf<22;sf++)
  4939. if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4940. sprintf(tstr,"%s ",
  4941. // &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  4942. &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  4943. }
  4944. else
  4945. {
  4946. for (int sf=0;sf<22;sf++)
  4947. if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  4948. sprintf(tstr,"%s ",
  4949. // &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  4950. &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  4951. }
  4952. l+=draw_string(buff,2,l+80,m,tstr,157,0);
  4953. gc=g;
  4954. do {
  4955. if (goals[gc].goal_data.time&768)
  4956. {
  4957. if (l>=120) if ((m+=13,l=0)>52+6*13) goto mend3;
  4958. //-------------------------------------------------------------------------------
  4959. //
  4960. // if (match_info.language!=2)
  4961. // if (goals[gc].goal_data.time&256)
  4962. // sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  4963. // else
  4964. // sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  4965. // else
  4966. // if (goals[gc].goal_data.time&256)
  4967. // sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  4968. // else
  4969. // sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  4970. //
  4971. //-------------------------------------------------------------------------------
  4972. // replaces above code... Forget about translations, new code will handle it.
  4973. if (goals[gc].goal_data.time&256)
  4974. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  4975. else
  4976. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  4977. }
  4978. else
  4979. {
  4980. if (l>=176) if ((m+=13,l=0)>52+6*13) goto mend3;
  4981. sprintf(tstr,"%d",goals[gc].goal_data.time);
  4982. }
  4983. l+=draw_string(buff,2,l+80,m,tstr,157,0);
  4984. goals[gc].goal_data.used|=1;
  4985. do {
  4986. gc++;
  4987. if ((goals[gc].goal_data.used&5)==4 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  4988. {
  4989. l+=draw_string(buff,2,l+80,m,",",157,0);
  4990. break;
  4991. }
  4992. } while (goals[gc].goal_data.used);
  4993. } while (goals[gc].goal_data.used);
  4994. if ((m+=13)>104+6*13) goto mend3;
  4995. }
  4996. g++;
  4997. }
  4998. mend3:;
  4999. mhgt=((m+84)>>5)<<4;
  5000. g=0;
  5001. m=104;
  5002. while (goals[g].goal_data.used)
  5003. {
  5004. if ((goals[g].goal_data.used&9)==8)
  5005. {
  5006. l=0;
  5007. if (!(goals[g].goal_data.time&512))
  5008. {
  5009. for (int sf=0;sf<22;sf++)
  5010. if (game_data[TEMPb].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5011. sprintf(tstr,"%s ",
  5012. // &game_data[setup.team_b].players[sf].name[game_data[setup.team_b].players[sf].goal_index]);
  5013. &GetPLAYERSname( EUROmatch_info.TeamBsquad[sf], setup.team_b, INITIAL_SURNAME )[0]);
  5014. }
  5015. else
  5016. {
  5017. for (int sf=0;sf<22;sf++)
  5018. if (game_data[TEMPa].players[sf].squad_number==goals[g].goal_data.scorer) break;
  5019. sprintf(tstr,"%s ",
  5020. // &game_data[setup.team_a].players[sf].name[game_data[setup.team_a].players[sf].goal_index]);
  5021. &GetPLAYERSname( EUROmatch_info.TeamAsquad[sf], setup.team_a, INITIAL_SURNAME )[0]);
  5022. }
  5023. l+=draw_string(buff,2,l+356,m,tstr,157,0);
  5024. gc=g;
  5025. do {
  5026. if (goals[gc].goal_data.time&768)
  5027. {
  5028. if (l>=120) if ((m+=13,l=0)>104+6*13) goto mend4;
  5029. //-------------------------------------------------------------------------------
  5030. //
  5031. // if (match_info.language!=2)
  5032. // if (goals[gc].goal_data.time&256)
  5033. // sprintf(tstr,"%d PEN",goals[gc].goal_data.time&255);
  5034. // else
  5035. // sprintf(tstr,"%d O.G",goals[gc].goal_data.time&255);
  5036. // else
  5037. // if (goals[gc].goal_data.time&256)
  5038. // sprintf(tstr,"%d ELF",goals[gc].goal_data.time&255);
  5039. // else
  5040. // sprintf(tstr,"%d ET",goals[gc].goal_data.time&255);
  5041. //
  5042. //-------------------------------------------------------------------------------
  5043. // replaces above code... Forget about translations, new code will handle it.
  5044. if (goals[gc].goal_data.time&256)
  5045. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( PENS_TEXT ) );
  5046. else
  5047. sprintf(tstr,"%d %s",goals[gc].goal_data.time&255, GetTEXT( OWNG_TEXT ) );
  5048. }
  5049. else
  5050. {
  5051. if (l>=176) if ((m+=13,l=0)>104+6*13) goto mend4;
  5052. sprintf(tstr,"%d",goals[gc].goal_data.time);
  5053. }
  5054. l+=draw_string(buff,2,l+356,m,tstr,157,0);
  5055. goals[gc].goal_data.used|=1;
  5056. do {
  5057. gc++;
  5058. if ((goals[gc].goal_data.used&9)==8 && goals[gc].goal_data.scorer==goals[g].goal_data.scorer && (goals[gc].goal_data.time&512)==(goals[g].goal_data.time&512))
  5059. {
  5060. l+=draw_string(buff,2,l+356,m,",",157,0);
  5061. break;
  5062. }
  5063. } while (goals[gc].goal_data.used);
  5064. } while (goals[gc].goal_data.used);
  5065. if ((m+=13)>104+6*13) goto mend4;
  5066. }
  5067. g++;
  5068. }
  5069. mend4:;
  5070. if (mhgt<((m+84)>>5)<<4) mhgt=((m+84)>>5)<<4;
  5071. gc=0;
  5072. while (goals[gc].goal_data.used)
  5073. goals[gc++].goal_data.used&=0xfe;
  5074. }
  5075. void
  5076. fulltime_menu(buff_info *buff)
  5077. {
  5078. char tstr[50];
  5079. draw_menu_box(buff);
  5080. if (scrmode==0x13)
  5081. {
  5082. draw_sprite(buff,30,10,11,0);
  5083. draw_sprite(buff,31,243,11,0);
  5084. draw_string(buff,1,144,30,GetTEXT( FLTM_TEXT ),207,2);
  5085. draw_string(buff,0,110,42, EUROmatch_info.TeamAname, 31,1);
  5086. sprintf(tstr,"%d",team_a_goals);
  5087. draw_string(buff,0,131,42,tstr,31,1);
  5088. sprintf(tstr,"%d",team_b_goals);
  5089. draw_string(buff,0,157,42,tstr,31,0);
  5090. draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5091. // draw_sprite(buff,49,134,38,0);
  5092. score_breakdown_l(buff);
  5093. }
  5094. else
  5095. {
  5096. draw_sprite(buff,19,20,24,0);
  5097. draw_sprite(buff,20,486,24,0);
  5098. draw_string(buff,2,288,56,GetTEXT( FLTM_TEXT ),207,2);
  5099. draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5100. sprintf(tstr,"%d",team_a_goals);
  5101. draw_string(buff,2,262,80,tstr,31,1);
  5102. sprintf(tstr,"%d",team_b_goals);
  5103. draw_string(buff,2,314,80,tstr,31,0);
  5104. draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5105. // draw_sprite(buff,43,268,72,0);
  5106. score_breakdown_h(buff);
  5107. }
  5108. }
  5109. void
  5110. extratime_menu(buff_info *buff)
  5111. {
  5112. char tstr[50];
  5113. draw_menu_box(buff);
  5114. if (scrmode==0x13)
  5115. {
  5116. draw_sprite(buff,30,10,11,0);
  5117. draw_sprite(buff,31,243,11,0);
  5118. draw_string(buff,1,144,30,GetTEXT( EXTM_TEXT ),207,2);
  5119. draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5120. sprintf(tstr,"%d",team_a_goals);
  5121. draw_string(buff,0,131,42,tstr,31,1);
  5122. sprintf(tstr,"%d",team_b_goals);
  5123. draw_string(buff,0,157,42,tstr,31,0);
  5124. draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5125. // draw_sprite(buff,49,134,38,0);
  5126. score_breakdown_l(buff);
  5127. }
  5128. else
  5129. {
  5130. draw_sprite(buff,19,20,24,0);
  5131. draw_sprite(buff,20,486,24,0);
  5132. draw_string(buff,2,288,56,GetTEXT( EXTM_TEXT ),207,2);
  5133. draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5134. sprintf(tstr,"%d",team_a_goals);
  5135. draw_string(buff,2,262,80,tstr,31,1);
  5136. sprintf(tstr,"%d",team_b_goals);
  5137. draw_string(buff,2,314,80,tstr,31,0);
  5138. draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5139. // draw_sprite(buff,43,268,72,0);
  5140. score_breakdown_h(buff);
  5141. }
  5142. }
  5143. void
  5144. halftime_menu(buff_info *buff)
  5145. {
  5146. char tstr[50];
  5147. draw_menu_box(buff);
  5148. if (scrmode==0x13)
  5149. {
  5150. draw_sprite(buff,30,10,11,0);
  5151. draw_sprite(buff,31,243,11,0);
  5152. draw_string(buff,1,144,30,GetTEXT( HFTM_TEXT ),207,2);
  5153. draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5154. sprintf(tstr,"%d",team_a_goals);
  5155. draw_string(buff,0,131,42,tstr,31,1);
  5156. sprintf(tstr,"%d",team_b_goals);
  5157. draw_string(buff,0,157,42,tstr,31,0);
  5158. draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5159. // draw_sprite(buff,49,134,38,0);
  5160. score_breakdown_l(buff);
  5161. }
  5162. else
  5163. {
  5164. draw_sprite(buff,19,20,24,0);
  5165. draw_sprite(buff,20,486,24,0);
  5166. draw_string(buff,2,288,56,GetTEXT( HFTM_TEXT ),207,2);
  5167. draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5168. sprintf(tstr,"%d",team_a_goals);
  5169. draw_string(buff,2,262,80,tstr,31,1);
  5170. sprintf(tstr,"%d",team_b_goals);
  5171. draw_string(buff,2,314,80,tstr,31,0);
  5172. draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5173. // draw_sprite(buff,43,268,72,0);
  5174. score_breakdown_h(buff);
  5175. }
  5176. }
  5177. void
  5178. penalty_shootout_menu(buff_info *buff)
  5179. {
  5180. char tstr[50];
  5181. draw_menu_box(buff);
  5182. if (scrmode==0x13)
  5183. {
  5184. draw_sprite(buff,30,10,11,0);
  5185. draw_sprite(buff,31,243,11,0);
  5186. draw_string(buff,1,144,30,GetTEXT( PNST_TEXT ),207,2);
  5187. draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5188. sprintf(tstr,"%d",team_a_goals);
  5189. draw_string(buff,0,131,42,tstr,31,1);
  5190. sprintf(tstr,"%d",team_b_goals);
  5191. draw_string(buff,0,157,42,tstr,31,0);
  5192. draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5193. // draw_sprite(buff,49,134,38,0);
  5194. score_breakdown_l(buff);
  5195. }
  5196. else
  5197. {
  5198. draw_sprite(buff,19,20,24,0);
  5199. draw_sprite(buff,20,486,24,0);
  5200. draw_string(buff,2,288,56,GetTEXT( PNST_TEXT ),207,2);
  5201. draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5202. sprintf(tstr,"%d",team_a_goals);
  5203. draw_string(buff,2,262,80,tstr,31,1);
  5204. sprintf(tstr,"%d",team_b_goals);
  5205. draw_string(buff,2,314,80,tstr,31,0);
  5206. draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5207. // draw_sprite(buff,43,268,72,0);
  5208. score_breakdown_h(buff);
  5209. }
  5210. }
  5211. void
  5212. final_score_menu(buff_info *buff)
  5213. {
  5214. char tstr[50];
  5215. draw_menu_box(buff);
  5216. if (scrmode==0x13)
  5217. {
  5218. draw_sprite(buff,30,10,11,0);
  5219. draw_sprite(buff,31,243,11,0);
  5220. draw_string(buff,1,144,30,GetTEXT( FNSP_TEXT ),207,2);
  5221. draw_string(buff,0,110,42,EUROmatch_info.TeamAname,31,1);
  5222. sprintf(tstr,"%d",team_a_goals);
  5223. draw_string(buff,0,131,42,tstr,31,1);
  5224. sprintf(tstr,"%d",team_b_goals);
  5225. draw_string(buff,0,157,42,tstr,31,0);
  5226. draw_string(buff,0,178,42,EUROmatch_info.TeamBname,31,0);
  5227. // draw_sprite(buff,49,134,38,0);
  5228. score_breakdown_l(buff);
  5229. }
  5230. else
  5231. {
  5232. draw_sprite(buff,19,20,24,0);
  5233. draw_sprite(buff,20,486,24,0);
  5234. draw_string(buff,2,288,56,GetTEXT( FNSP_TEXT ),207,2);
  5235. draw_string(buff,2,220,80,EUROmatch_info.TeamAname,31,1);
  5236. sprintf(tstr,"%d",team_a_goals);
  5237. draw_string(buff,2,262,80,tstr,31,1);
  5238. sprintf(tstr,"%d",team_b_goals);
  5239. draw_string(buff,2,314,80,tstr,31,0);
  5240. draw_string(buff,2,356,80,EUROmatch_info.TeamBname,31,0);
  5241. // draw_sprite(buff,43,268,72,0);
  5242. score_breakdown_h(buff);
  5243. }
  5244. }
  5245. void
  5246. owngoal_menu(buff_info *buff, int team, int player, int time)
  5247. {
  5248. int shirt;
  5249. if (!team)
  5250. shirt=ppt[player+((match_half&1)?11:0)].number-1;
  5251. else
  5252. shirt=ppt[player+((match_half&1)?0:11)].number-1;
  5253. draw_menu_box(buff);
  5254. if (scrmode==0x13)
  5255. {
  5256. draw_sprite(buff,30+team,10,11,0);
  5257. draw_sprite(buff,2+shirt,16,21,0);
  5258. draw_string(buff,0,160,30,GetTEXT( OWGL_TEXT ),207,1);
  5259. if (!team)
  5260. draw_string(buff,0,160,30,
  5261. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5262. 31,0);
  5263. else
  5264. draw_string(buff,0,160,30,
  5265. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5266. 31,0);
  5267. draw_sprite(buff,40,278,18,0);
  5268. }
  5269. else
  5270. {
  5271. draw_sprite(buff,19+team,20,24,0);
  5272. draw_string(buff,2,320,56,GetTEXT( OWGL_TEXT ),207,1);
  5273. if (!team)
  5274. {
  5275. draw_sprite_s(buff,53+shirt,42,51,0);
  5276. draw_string(buff,2,320,56,
  5277. GetPLAYERSname( EUROmatch_info.TeamAsquad[player], setup.team_a, INITIAL_SURNAME ),
  5278. 31,0);
  5279. }
  5280. else
  5281. {
  5282. draw_sprite_s(buff,68+shirt,42,51,0);
  5283. draw_string(buff,2,320,56,
  5284. GetPLAYERSname( EUROmatch_info.TeamBsquad[player], setup.team_b, INITIAL_SURNAME ),
  5285. 31,0);
  5286. }
  5287. draw_sprite(buff,29,556,38,0);
  5288. }
  5289. }
  5290. #define M_WIDTH 256
  5291. extern short stat_sheet[11][2];
  5292. void
  5293. stats_menu(buff_info *buff)
  5294. {
  5295. draw_menu_box(buff);
  5296. if (scrmode==0x13)
  5297. {
  5298. draw_sprite(buff,30,8,8,0); // Kit
  5299. draw_sprite(buff,31,256-48,8,0); // Kit
  5300. draw_string(buff,0,M_WIDTH/2,32,"MATCH STATISTICS",207,2);
  5301. draw_string(buff,0,M_WIDTH/2,54,"Tackling",31,2);
  5302. draw_string(buff,0,M_WIDTH/2,61,"Passing",31,2);
  5303. draw_string(buff,0,M_WIDTH/2,68,"Shooting",31,2);
  5304. draw_string(buff,0,M_WIDTH/2,75,"Possession",31,2);
  5305. draw_string(buff,0,M_WIDTH/2,82,"Work",31,2);
  5306. draw_string(buff,0,M_WIDTH/2,89,"Corners",31,2);
  5307. draw_string(buff,0,M_WIDTH/2,96,"Direct Free-kicks",31,2);
  5308. draw_string(buff,0,M_WIDTH/2,103,"Penalties",31,2);
  5309. draw_string(buff,0,M_WIDTH/2,110,"Offsides committed",31,2);
  5310. draw_string(buff,0,M_WIDTH/2,117,"Yellow cards",31,2);
  5311. draw_string(buff,0,M_WIDTH/2,124,"Red cards",31,2);
  5312. char str1[20],str2[20];
  5313. for (short i=0; i<11; i++)
  5314. {
  5315. if (i<4)
  5316. {
  5317. sprintf(str1,"%d%%",stat_sheet[i][0]);
  5318. sprintf(str2,"%d%%",stat_sheet[i][1]);
  5319. }
  5320. else
  5321. {
  5322. sprintf(str1,"%d",stat_sheet[i][0]);
  5323. sprintf(str2,"%d",stat_sheet[i][1]);
  5324. }
  5325. draw_string(buff,0,16,54+(i*7),str1,31,0);
  5326. draw_string(buff,0,256-32,54+(i*7),str2,31,1);
  5327. }
  5328. }
  5329. else
  5330. {
  5331. draw_string(buff,2,192,56,GetTEXT( KIOF_TEXT ),31,2);
  5332. }
  5333. }
  5334. void draw_m_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5335. {
  5336. if (scrmode==0x13)
  5337. {
  5338. draw_sprite(buff,36,x,y,0);
  5339. draw_string(buff,0,x+23,y+5,string,col,2);
  5340. if (legend!=NULL) draw_string(buff,0,x+2,y-1,legend,157,2);
  5341. }
  5342. else
  5343. {
  5344. draw_sprite(buff,25,x,y,0);
  5345. draw_string(buff,2,x+45,y+8,string,col,2);
  5346. if (legend!=NULL) draw_string(buff,2,x+4,y-2,legend,157,2);
  5347. }
  5348. }
  5349. void draw_l_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5350. {
  5351. if (scrmode==0x13)
  5352. {
  5353. draw_sprite(buff,35,x,y,0);
  5354. draw_string(buff,0,x+41,y+5,string,col,2);
  5355. if (legend!=NULL) draw_string(buff,0,x+2,y-1,legend,157,2);
  5356. }
  5357. else
  5358. {
  5359. draw_sprite(buff,24,x,y,0);
  5360. draw_string(buff,2,x+82,y+8,string,col,2);
  5361. if (legend!=NULL) draw_string(buff,2,x+4,y-2,legend,157,2);
  5362. }
  5363. }
  5364. void draw_s_butt(buff_info *buff,int x,int y,char *string,BYTE col,char *legend)
  5365. {
  5366. if (scrmode==0x13)
  5367. {
  5368. draw_sprite(buff,37,x,y,0);
  5369. draw_string(buff,0,x+15,y+5,string,col,2);
  5370. if (legend!=NULL) draw_string(buff,0,x,y-1,legend,157,2);
  5371. }
  5372. else
  5373. {
  5374. draw_sprite(buff,26,x,y,0);
  5375. draw_string(buff,2,x+29,y+8,string,col,2);
  5376. if (legend!=NULL) draw_string(buff,2,x,y-2,legend,157,2);
  5377. }
  5378. }
  5379. struct
  5380. {
  5381. int formation;
  5382. int sub_off,sub_on;
  5383. }option_info;
  5384. int sub_c;
  5385. extern short replay_seconds;
  5386. extern char allow_replay;
  5387. int opt_b;
  5388. void
  5389. options_menu(buff_info *buff, int team, int user_no)
  5390. {
  5391. char tstr[50];
  5392. if (scrmode==0x13)
  5393. {
  5394. if (opt_b!=0) draw_l_butt(buff,62,32,GetTEXT( RPLY_TEXT ),(replay_seconds==0||!allow_replay)?2:31,"F1");
  5395. if (opt_b!=1) draw_l_butt(buff,62,48,GetTEXT( SBTN_TEXT ),(match_mode||!EUROmatch_info.substitutes||sub_c<2||user_no<=0)?2:31,"F2");
  5396. if (opt_b!=2) draw_l_butt(buff,62,64,GetTEXT( FRMN_TEXT ),user_no<=0?2:31,"F3");
  5397. if (opt_b!=3) draw_l_butt(buff,62,80,GetTEXT( CANL_TEXT ),31,"F4");
  5398. draw_menu_box(buff);
  5399. if (opt_b==0) draw_l_butt(buff,62,32,GetTEXT( RPLY_TEXT ),31,"F1");
  5400. if (opt_b==1) draw_l_butt(buff,62,48,GetTEXT( SBTN_TEXT ),31,"F2");
  5401. if (opt_b==2) draw_l_butt(buff,62,64,GetTEXT( FRMN_TEXT ),31,"F3");
  5402. if (opt_b==3) draw_l_butt(buff,62,80,GetTEXT( CANL_TEXT ),31,"F4");
  5403. if (user_no>0)
  5404. {
  5405. draw_sprite(buff,30+team,18,38,0);
  5406. sprintf(tstr,"PLAYER %d",user_no);
  5407. draw_string(buff,0,36,87,tstr,157,2);
  5408. }
  5409. else
  5410. draw_sprite(buff,52,22,45,0);
  5411. }
  5412. else
  5413. {
  5414. if (opt_b!=0) draw_l_butt(buff,124,64,GetTEXT( RPLY_TEXT ),(replay_seconds==0||!allow_replay)?2:31,"F1");
  5415. if (opt_b!=1) draw_l_butt(buff,124,96,GetTEXT( SBTN_TEXT ),(match_mode||!EUROmatch_info.substitutes||sub_c<2||user_no<=0)?2:31,"F2");
  5416. if (opt_b!=2) draw_l_butt(buff,124,128,GetTEXT( FRMN_TEXT ),user_no<=0?2:31,"F3");
  5417. if (opt_b!=3) draw_l_butt(buff,124,160,GetTEXT( CANL_TEXT ),31,"F4");
  5418. draw_menu_box(buff);
  5419. if (opt_b==0) draw_l_butt(buff,124,64,GetTEXT( RPLY_TEXT ),31,"F1");
  5420. if (opt_b==1) draw_l_butt(buff,124,96,GetTEXT( SBTN_TEXT ),31,"F2");
  5421. if (opt_b==2) draw_l_butt(buff,124,128,GetTEXT( FRMN_TEXT ),31,"F3");
  5422. if (opt_b==3) draw_l_butt(buff,124,160,GetTEXT( CANL_TEXT ),31,"F4");
  5423. if (user_no>0)
  5424. {
  5425. draw_sprite(buff,19+team,36,76,0);
  5426. sprintf(tstr,"PLAYER %d",user_no);
  5427. draw_string(buff,2,72,174,tstr,157,2);
  5428. }
  5429. else
  5430. draw_sprite(buff,46,45,90,0);
  5431. }
  5432. }
  5433. char forms[10][6]=
  5434. {
  5435. "4=3=3",
  5436. "5=3=2",
  5437. "6=3=1",
  5438. "4=2=4",
  5439. "5=1=4",
  5440. "4=0=6",
  5441. "3=1=6",
  5442. "4=1=5",
  5443. "5=2=3",
  5444. "4=4=2",
  5445. };
  5446. int for_b;
  5447. void
  5448. formation_menu(buff_info *buff, int team, int user_no)
  5449. {
  5450. char tstr[50];
  5451. if (scrmode==0x13)
  5452. {
  5453. if (for_b!=0) draw_l_butt(buff,62,32,forms[option_info.formation],31,"F1");
  5454. if (for_b!=1) draw_l_butt(buff,62,48,GetTEXT( SLCT_TEXT ),31,"F2");
  5455. if (for_b!=2) draw_l_butt(buff,62,64,GetTEXT( CANL_TEXT ),31,"F3");
  5456. draw_menu_box(buff);
  5457. if (for_b==0) draw_l_butt(buff,62,32,forms[option_info.formation],31,"F1");
  5458. if (for_b==1) draw_l_butt(buff,62,48,GetTEXT( SLCT_TEXT ),31,"F2");
  5459. if (for_b==2) draw_l_butt(buff,62,64,GetTEXT( CANL_TEXT ),31,"F3");
  5460. draw_sprite(buff,30+team,18,34,0);
  5461. }
  5462. else
  5463. {
  5464. if (for_b!=0) draw_l_butt(buff,124,64,forms[option_info.formation],31,"F1");
  5465. if (for_b!=1) draw_l_butt(buff,124,96,GetTEXT( SLCT_TEXT ),31,"F2");
  5466. if (for_b!=2) draw_l_butt(buff,124,128,GetTEXT( CANL_TEXT ),31,"F3");
  5467. draw_menu_box(buff);
  5468. if (for_b==0) draw_l_butt(buff,124,64,forms[option_info.formation],31,"F1");
  5469. if (for_b==1) draw_l_butt(buff,124,96,GetTEXT( SLCT_TEXT ),31,"F2");
  5470. if (for_b==2) draw_l_butt(buff,124,128,GetTEXT( CANL_TEXT ),31,"F3");
  5471. draw_sprite(buff,19+team,36,68,0);
  5472. }
  5473. }
  5474. int sub_b;
  5475. void
  5476. substitution_menu(buff_info *buff, int team, int user_no)
  5477. {
  5478. char tstr[50];
  5479. if (scrmode==0x13)
  5480. {
  5481. if (sub_b!=0) draw_m_butt(buff,88,32,GetTEXT( SOFF_TEXT ),31,"F1");
  5482. if (sub_b!=1) draw_l_butt(buff,70,48,GetTEXT( SUBT_TEXT ),31,"F2");
  5483. if (sub_b!=2) draw_l_butt(buff,70,64,GetTEXT( CANL_TEXT ),31,"F3");
  5484. if (sub_b!=3) draw_m_butt(buff,88,80,GetTEXT( SBON_TEXT ),31,"F4");
  5485. draw_menu_box(buff);
  5486. if (sub_b==0) draw_m_butt(buff,88,32,GetTEXT( SOFF_TEXT ),31,"F1");
  5487. if (sub_b==1) draw_l_butt(buff,70,48,GetTEXT( SUBT_TEXT ),31,"F2");
  5488. if (sub_b==2) draw_l_butt(buff,70,64,GetTEXT( CANL_TEXT ),31,"F3");
  5489. if (sub_b==3) draw_m_butt(buff,88,80,GetTEXT( SBON_TEXT ),31,"F4");
  5490. draw_sprite(buff,30+team,23,48,0);
  5491. draw_sprite(buff,30+team,166,38,0);
  5492. if (!team)
  5493. {
  5494. draw_string(buff,0,41,37,
  5495. // &game_data[setup.team_a].players[option_info.sub_off].name[game_data[setup.team_a].players[option_info.sub_off].goal_index],
  5496. &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_off], setup.team_a, INITIAL_SURNAME )[0],
  5497. 157,2);
  5498. draw_sprite(buff,2+teams[option_info.sub_off+((match_half&1)?11:0)].shirt-1,29,58,0);
  5499. draw_string(buff,0,183,85,
  5500. // &game_data[setup.team_a].players[option_info.sub_on].name[game_data[setup.team_a].players[option_info.sub_on].goal_index],
  5501. &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_on], setup.team_a, INITIAL_SURNAME )[0],
  5502. 157,2);
  5503. draw_sprite(buff,2+option_info.sub_on,172,48,0);
  5504. }
  5505. else
  5506. {
  5507. draw_string(buff,0,41,37,
  5508. // &game_data[setup.team_b].players[option_info.sub_off].name[game_data[setup.team_b].players[option_info.sub_off].goal_index],
  5509. &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_off], setup.team_b, INITIAL_SURNAME )[0],
  5510. 157,2);
  5511. draw_sprite(buff,2+teams[option_info.sub_off+((match_half&1)?0:11)].shirt-1,29,58,0);
  5512. draw_string(buff,0,183,85,
  5513. // &game_data[setup.team_b].players[option_info.sub_on].name[game_data[setup.team_b].players[option_info.sub_on].goal_index],
  5514. &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_on], setup.team_b, INITIAL_SURNAME )[0],
  5515. 157,2);
  5516. draw_sprite(buff,2+option_info.sub_on,172,48,0);
  5517. }
  5518. }
  5519. else
  5520. {
  5521. if (sub_b!=0) draw_m_butt(buff,176,64,GetTEXT( SOFF_TEXT ),31,"F1");
  5522. if (sub_b!=1) draw_l_butt(buff,140,96,GetTEXT( SUBT_TEXT ),31,"F2");
  5523. if (sub_b!=2) draw_l_butt(buff,140,128,GetTEXT( CANL_TEXT ),31,"F3");
  5524. if (sub_b!=3) draw_m_butt(buff,176,160,GetTEXT( SBON_TEXT ),31,"F4");
  5525. draw_menu_box(buff);
  5526. if (sub_b==0) draw_m_butt(buff,176,64,GetTEXT( SOFF_TEXT ),31,"F1");
  5527. if (sub_b==1) draw_l_butt(buff,140,96,GetTEXT( SUBT_TEXT ),31,"F2");
  5528. if (sub_b==2) draw_l_butt(buff,140,128,GetTEXT( CANL_TEXT ),31,"F3");
  5529. if (sub_b==3) draw_m_butt(buff,176,160,GetTEXT( SBON_TEXT ),31,"F4");
  5530. draw_sprite(buff,19+team,46,96,0);
  5531. draw_sprite(buff,19+team,332,76,0);
  5532. if (!team)
  5533. {
  5534. draw_string(buff,2,81,72,
  5535. // &game_data[setup.team_a].players[option_info.sub_off].name[game_data[setup.team_a].players[option_info.sub_off].goal_index],
  5536. &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_off], setup.team_a, INITIAL_SURNAME )[0],
  5537. 157,2);
  5538. draw_sprite_s(buff,53+teams[option_info.sub_off+((match_half&1)?11:0)].shirt-1,68,123,0);
  5539. draw_string(buff,2,366,168,
  5540. // &game_data[setup.team_a].players[option_info.sub_on].name[game_data[setup.team_a].players[option_info.sub_on].goal_index],
  5541. &GetPLAYERSname( EUROmatch_info.TeamAsquad[option_info.sub_on], setup.team_a, INITIAL_SURNAME )[0],
  5542. 157,2);
  5543. draw_sprite_s(buff,53+option_info.sub_on,354,103,0);
  5544. }
  5545. else
  5546. {
  5547. draw_string(buff,2,81,72,
  5548. // &game_data[setup.team_b].players[option_info.sub_off].name[game_data[setup.team_b].players[option_info.sub_off].goal_index],
  5549. &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_off], setup.team_b, INITIAL_SURNAME )[0],
  5550. 157,2);
  5551. draw_sprite_s(buff,68+teams[option_info.sub_off+((match_half&1)?0:11)].shirt-1,68,123,0);
  5552. draw_string(buff,2,366,168,
  5553. // &game_data[setup.team_b].players[option_info.sub_on].name[game_data[setup.team_b].players[option_info.sub_on].goal_index],
  5554. &GetPLAYERSname( EUROmatch_info.TeamBsquad[option_info.sub_on], setup.team_b, INITIAL_SURNAME )[0],
  5555. 157,2);
  5556. draw_sprite_s(buff,68+option_info.sub_on,354,103,0);
  5557. }
  5558. }
  5559. }
  5560. int rep_b;
  5561. int play,speed;
  5562. float reppos;
  5563. void
  5564. replay_menu(buff_info *buff, int user_no)
  5565. {
  5566. char tstr[50];
  5567. if (scrmode==0x13)
  5568. {
  5569. if (rep_b!=0)
  5570. {
  5571. draw_s_butt(buff,112,32,"",31,"F1");
  5572. draw_sprite_hf(buff,39,121,35,0);
  5573. draw_sprite_hf(buff,39,127,35,0);
  5574. }
  5575. if (rep_b!=1)
  5576. {
  5577. draw_s_butt(buff,146,32,"",31,"F2");
  5578. draw_sprite(buff,39,155,35,0);
  5579. draw_sprite(buff,39,161,35,0);
  5580. }
  5581. if (rep_b!=2) draw_s_butt(buff,185,32,"",31,"F3");
  5582. if (!play) draw_sprite(buff,39,197,35,0);
  5583. if (rep_b!=3) draw_m_butt(buff,225,32,GetTEXT( DONE_TEXT ),31,"F4");
  5584. draw_menu_box(buff);
  5585. sprintf(tstr,"%.2f",reppos);
  5586. draw_m_butt(buff,17,32,tstr,157,NULL);
  5587. sprintf(tstr,"%d",speed);
  5588. draw_s_butt(buff,69,32,tstr,31,NULL);
  5589. if (rep_b==0)
  5590. {
  5591. draw_s_butt(buff,112,32,"",31,"F1");
  5592. draw_sprite_hf(buff,39,121,35,0);
  5593. draw_sprite_hf(buff,39,127,35,0);
  5594. }
  5595. if (rep_b==1)
  5596. {
  5597. draw_s_butt(buff,146,32,"",31,"F2");
  5598. draw_sprite(buff,39,155,35,0);
  5599. draw_sprite(buff,39,161,35,0);
  5600. }
  5601. if (rep_b==2) draw_s_butt(buff,185,32,"",31,"F3");
  5602. if (play||rep_b==2) draw_sprite(buff,39,197,35,0);
  5603. if (rep_b==3) draw_m_butt(buff,225,32,GetTEXT( DONE_TEXT ),31,"F4");
  5604. }
  5605. else
  5606. {
  5607. if (rep_b!=0)
  5608. {
  5609. draw_s_butt(buff,224,64,"",31,"F1");
  5610. draw_sprite_hf(buff,28,240,70,0);
  5611. draw_sprite_hf(buff,28,252,70,0);
  5612. }
  5613. if (rep_b!=1)
  5614. {
  5615. draw_s_butt(buff,292,64,"",31,"F2");
  5616. draw_sprite(buff,28,310,70,0);
  5617. draw_sprite(buff,28,322,70,0);
  5618. }
  5619. if (rep_b!=2) draw_s_butt(buff,370,64,"",31,"F3");
  5620. if (!play) draw_sprite(buff,28,394,70,0);
  5621. if (rep_b!=3) draw_m_butt(buff,447,64,GetTEXT( DONE_TEXT ),31,"F4");
  5622. draw_menu_box(buff);
  5623. sprintf(tstr,"%.2f",reppos);
  5624. draw_m_butt(buff,34,64,tstr,157,NULL);
  5625. sprintf(tstr,"%d",speed);
  5626. draw_s_butt(buff,138,64,tstr,31,NULL);
  5627. if (rep_b==0)
  5628. {
  5629. draw_s_butt(buff,224,64,"",31,"F1");
  5630. draw_sprite_hf(buff,28,240,70,0);
  5631. draw_sprite_hf(buff,28,252,70,0);
  5632. }
  5633. if (rep_b==1)
  5634. {
  5635. draw_s_butt(buff,292,64,"",31,"F2");
  5636. draw_sprite(buff,28,310,70,0);
  5637. draw_sprite(buff,28,322,70,0);
  5638. }
  5639. if (rep_b==2) draw_s_butt(buff,370,64,"",31,"F3");
  5640. if (play||rep_b==2) draw_sprite(buff,28,394,70,0);
  5641. if (rep_b==3) draw_m_butt(buff,447,64,GetTEXT( DONE_TEXT ),31,"F4");
  5642. }
  5643. }
  5644. void
  5645. do_goal_menu(int team, int player, int time)
  5646. {
  5647. mdata1=team;
  5648. mdata2=player;
  5649. mdata3=time;
  5650. slco=0;
  5651. slide=oslide=44;
  5652. mcount=240;
  5653. if (menu) rdmenu=1;
  5654. menu=1;
  5655. }
  5656. void
  5657. do_booked_menu(int team, int player)
  5658. {
  5659. mdata1=team;
  5660. mdata2=player;
  5661. slco=0;
  5662. slide=oslide=44;
  5663. mcount=240;
  5664. if (menu) rdmenu=1;
  5665. menu=2;
  5666. }
  5667. void
  5668. do_off_menu(int team, int player)
  5669. {
  5670. mdata1=team;
  5671. mdata2=player;
  5672. slco=0;
  5673. slide=oslide=44;
  5674. mcount=240;
  5675. if (menu) rdmenu=1;
  5676. menu=3;
  5677. }
  5678. void
  5679. do_direct_menu(int team)
  5680. {
  5681. mdata1=team;
  5682. slco=0;
  5683. slide=oslide=44;
  5684. mcount=240;
  5685. if (menu) rdmenu=1;
  5686. menu=4;
  5687. }
  5688. void
  5689. do_indirect_menu(int team)
  5690. {
  5691. mdata1=team;
  5692. slco=0;
  5693. slide=oslide=44;
  5694. mcount=240;
  5695. if (menu) rdmenu=1;
  5696. menu=5;
  5697. }
  5698. void
  5699. do_penalty_menu(int team)
  5700. {
  5701. mdata1=team;
  5702. slco=0;
  5703. slide=oslide=44;
  5704. mcount=240;
  5705. if (menu) rdmenu=1;
  5706. menu=6;
  5707. }
  5708. void
  5709. do_corner_menu(int team)
  5710. {
  5711. mdata1=team;
  5712. slco=0;
  5713. slide=oslide=44;
  5714. mcount=240;
  5715. if (menu) rdmenu=1;
  5716. menu=7;
  5717. }
  5718. void
  5719. do_throw_menu(int team)
  5720. {
  5721. mdata1=team;
  5722. slco=0;
  5723. slide=oslide=44;
  5724. mcount=240;
  5725. if (menu) rdmenu=1;
  5726. menu=8;
  5727. }
  5728. void
  5729. do_goalkick_menu(int team)
  5730. {
  5731. mdata1=team;
  5732. slco=0;
  5733. slide=oslide=44;
  5734. mcount=240;
  5735. if (menu) rdmenu=1;
  5736. menu=9;
  5737. }
  5738. void
  5739. do_kickoff_menu(int team)
  5740. {
  5741. mdata1=team;
  5742. slco=0;
  5743. slide=oslide=44;
  5744. mcount=240;
  5745. if (menu) rdmenu=1;
  5746. menu=10;
  5747. }
  5748. void
  5749. do_offside_menu(int team)
  5750. {
  5751. mdata1=team;
  5752. slco=0;
  5753. slide=oslide=44;
  5754. mcount=240;
  5755. if (menu) rdmenu=1;
  5756. menu=11;
  5757. }
  5758. void
  5759. do_injured_menu(int team, int player)
  5760. {
  5761. mdata1=team;
  5762. mdata2=player;
  5763. slco=0;
  5764. slide=oslide=44;
  5765. mcount=240;
  5766. if (menu) rdmenu=1;
  5767. menu=12;
  5768. }
  5769. void
  5770. do_fulltime_menu()
  5771. {
  5772. slco=0;
  5773. slide=oslide=108;
  5774. mcount=240000;
  5775. if (menu) rdmenu=1;
  5776. menu=13;
  5777. mhgt=128;
  5778. }
  5779. void
  5780. do_extratime_menu()
  5781. {
  5782. slco=0;
  5783. slide=oslide=108;
  5784. mcount=240000;
  5785. if (menu) rdmenu=1;
  5786. menu=14;
  5787. mhgt=128;
  5788. }
  5789. void
  5790. do_halftime_menu()
  5791. {
  5792. slco=0;
  5793. slide=oslide=108;
  5794. mcount=240000;
  5795. if (menu) rdmenu=1;
  5796. menu=15;
  5797. mhgt=128;
  5798. }
  5799. void
  5800. do_penalty_shootout_menu()
  5801. {
  5802. slco=0;
  5803. slide=oslide=108;
  5804. mcount=340;
  5805. if (menu) rdmenu=1;
  5806. menu=16;
  5807. mhgt=128;
  5808. }
  5809. void
  5810. do_final_score_menu()
  5811. {
  5812. slco=0;
  5813. slide=oslide=108;
  5814. mcount=240;
  5815. if (menu) rdmenu=1;
  5816. menu=17;
  5817. mhgt=128;
  5818. }
  5819. void
  5820. do_owngoal_menu(int team, int player, int time)
  5821. {
  5822. mdata1=team;
  5823. mdata2=player;
  5824. mdata3=time;
  5825. slco=0;
  5826. slide=oslide=44;
  5827. mcount=240;
  5828. if (menu) rdmenu=1;
  5829. menu=18;
  5830. }
  5831. void
  5832. do_options_menu(int team,int user_no)
  5833. {
  5834. mdata1=team;
  5835. mdata2=user_no+1;
  5836. slco=0;
  5837. slide=oslide=108;
  5838. mcount=1000000;
  5839. if (menu) rdmenu=1;
  5840. menu=19;
  5841. }
  5842. void
  5843. do_formation_menu(int team,int user_no)
  5844. {
  5845. mdata1=team;
  5846. mdata2=user_no+1;
  5847. slco=0;
  5848. slide=oslide=92;
  5849. mcount=1000000;
  5850. if (menu) rdmenu=1;
  5851. menu=20;
  5852. }
  5853. void
  5854. do_substitution_menu(int team,int user_no)
  5855. {
  5856. mdata1=team;
  5857. mdata2=user_no+1;
  5858. slco=0;
  5859. slide=oslide=108;
  5860. mcount=1000000;
  5861. if (menu) rdmenu=1;
  5862. menu=21;
  5863. }
  5864. void
  5865. do_replay_menu(int user_no)
  5866. {
  5867. mdata1=user_no+1;
  5868. slco=0;
  5869. slide=oslide=34;
  5870. mcount=1000000;
  5871. if (menu) rdmenu=1;
  5872. menu=22;
  5873. }
  5874. void
  5875. do_ref_menu()
  5876. {
  5877. slco=0;
  5878. slide=oslide=44;
  5879. mcount=240;
  5880. if (menu) rdmenu=1;
  5881. menu=23;
  5882. }
  5883. void
  5884. do_stats_menu()
  5885. {
  5886. slco=0;
  5887. slide=oslide=140;
  5888. mcount=200*6;
  5889. if (menu) rdmenu=1;
  5890. menu=24;
  5891. }
  5892. struct user_vectors{
  5893. float x;
  5894. float y;
  5895. char m;
  5896. char f;
  5897. };
  5898. extern user_vectors users_dir[20];
  5899. extern void convert_inputs();
  5900. #ifndef LINK
  5901. extern void get_user_inputs();
  5902. extern void process_user_inputs();
  5903. extern volatile int readptr;
  5904. extern volatile int writeptr;
  5905. #else
  5906. extern "C" void get_user_inputs();
  5907. extern "C" void process_user_inputs();
  5908. extern "C" volatile int readptr;
  5909. extern "C" volatile int writeptr;
  5910. #endif
  5911. #define RIGHT_DIR 1
  5912. #define LEFT_DIR 2
  5913. #define DOWN_DIR 4
  5914. #define UP_DIR 8
  5915. #define FIRE1_DIR 16
  5916. #define FIRE2_DIR 32
  5917. #define F1_DIR 64
  5918. #define F2_DIR 128
  5919. #define F3_DIR 256
  5920. #define F4_DIR 512
  5921. #define BUTT_WAIT 65
  5922. static int count_ur;
  5923. static int count_ul;
  5924. static int count_ud;
  5925. static int count_uu;
  5926. static int count_uf1;
  5927. static int count_uf2;
  5928. static int uf1_p;
  5929. static int uf2_p;
  5930. static int uf3_p;
  5931. static int uf4_p;
  5932. int
  5933. get_dir(int user_no)
  5934. {
  5935. int out;
  5936. #ifdef LINK
  5937. if (user_no>=0)
  5938. {
  5939. icth=32767;
  5940. isth=0;
  5941. get_user_inputs();
  5942. process_user_inputs();
  5943. writeptr++;
  5944. writeptr&=511;
  5945. convert_inputs();
  5946. readptr++;
  5947. readptr&=511;
  5948. }
  5949. else
  5950. #endif
  5951. {
  5952. users_dir[0].x=0;
  5953. users_dir[0].y=0;
  5954. users_dir[0].f=0;
  5955. #ifdef LINK
  5956. if (keys[0xcd]) users_dir[0].x=1;
  5957. if (keys[0xcb]) users_dir[0].x=-1;
  5958. if (keys[0xd0]) users_dir[0].y=1;
  5959. if (keys[0xc8]) users_dir[0].y=-1;
  5960. #else
  5961. if (keys[0x4d]) users_dir[0].x=1;
  5962. if (keys[0x4b]) users_dir[0].x=-1;
  5963. if (keys[0x50]) users_dir[0].y=1;
  5964. if (keys[0x48]) users_dir[0].y=-1;
  5965. #endif
  5966. if (keys[0x52]) users_dir[0].f=1;
  5967. if (keys[0x53]) users_dir[0].f=1;
  5968. user_no=0;
  5969. }
  5970. out=0;
  5971. if (users_dir[user_no].x>0.1)
  5972. {if (count>count_ur+50) out|=RIGHT_DIR,count_ur=count+100;}
  5973. else
  5974. if (users_dir[user_no].x<-0.1)
  5975. {if (count>count_ul+50) out|=LEFT_DIR,count_ul=count+100;}
  5976. else
  5977. count_ul=count_ur=0;
  5978. if (users_dir[user_no].y>0.1)
  5979. {if (count>count_ud+50) out|=DOWN_DIR,count_ud=count+100;}
  5980. else
  5981. if (users_dir[user_no].y<-0.1)
  5982. {if (count>count_uu+50) out|=UP_DIR,count_uu=count+100;}
  5983. else
  5984. count_uu=count_ud=0;
  5985. if (users_dir[user_no].f&1)
  5986. {if (count>count_uf1+50) out|=FIRE1_DIR,count_uf1=count+100;}
  5987. else
  5988. count_uf1=0;
  5989. if (users_dir[user_no].f&2)
  5990. {if (count>count_uf2+50) out|=FIRE2_DIR,count_uf2=count+100;}
  5991. else
  5992. count_uf2=0;
  5993. if (!keys[0x3b]) uf1_p=0; else if (!uf1_p) out|=F1_DIR|FIRE1_DIR,uf1_p=1;
  5994. if (!keys[0x3c]) uf2_p=0; else if (!uf2_p) out|=F2_DIR|FIRE1_DIR,uf2_p=1;
  5995. if (!keys[0x3d]) uf3_p=0; else if (!uf3_p) out|=F3_DIR|FIRE1_DIR,uf3_p=1;
  5996. if (!keys[0x3e]) uf4_p=0; else if (!uf4_p) out|=F4_DIR|FIRE1_DIR,uf4_p=1;
  5997. return(out);
  5998. }
  5999. extern void do_replay_render3d(float pos);
  6000. extern void setup_replay();
  6001. extern void reset_replay();
  6002. extern void frame_count();
  6003. void
  6004. replay(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6005. datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no)
  6006. {
  6007. int dir,repcount;
  6008. float repstep;
  6009. rep_b=3;
  6010. uf1_p=uf2_p=uf3_p=uf4_p=1;
  6011. play=1;
  6012. speed=5;
  6013. reppos=0;
  6014. setup_replay();
  6015. do_replay_menu(user_no);
  6016. do
  6017. {
  6018. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6019. main_buff.dump(0,0);
  6020. frame_count();
  6021. } while (slide>0);
  6022. do
  6023. {
  6024. dir=get_dir(user_no);
  6025. if (dir&F1_DIR) rep_b=0;
  6026. if (dir&F2_DIR) rep_b=1;
  6027. if (dir&F3_DIR) rep_b=2;
  6028. if (dir&F4_DIR) rep_b=3;
  6029. if (dir&LEFT_DIR) (rep_b+=3)%=4;
  6030. if (dir&RIGHT_DIR) ++rep_b%=4;
  6031. repcount=count;
  6032. do_replay_render3d(reppos);
  6033. frame_count();
  6034. #ifndef LINK
  6035. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6036. main_buff.dump(0,0);
  6037. #endif
  6038. repstep=(count-repcount)/200.;
  6039. if (dir&(FIRE1_DIR|FIRE2_DIR))
  6040. {
  6041. switch(rep_b)
  6042. {
  6043. case 0:
  6044. if (speed>0) --speed;
  6045. break;
  6046. case 1:
  6047. if (speed<5) ++speed;
  6048. break;
  6049. case 2:
  6050. if (speed)
  6051. play=!play;
  6052. else
  6053. reppos+=repstep*3/5.;
  6054. break;
  6055. case 3:
  6056. goto re_exit;
  6057. }
  6058. }
  6059. if (play) reppos+=repstep*speed/5.;
  6060. if (reppos>=replay_seconds) reppos=0,play=0;
  6061. } while (!keys[1]);
  6062. keys[1]=0;
  6063. re_exit:;
  6064. if (user_no>=0)
  6065. while (users_dir[user_no].f&3)
  6066. get_dir(user_no);
  6067. keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6068. reset_replay();
  6069. mcount=1;
  6070. }
  6071. extern void SubstituePlayers(int team_no, int player1, int player2);
  6072. extern void sub_player(short team_no, short player1, short player2);
  6073. char sub_pending;
  6074. int sub_p_a,sub_p_b;
  6075. void
  6076. substitution(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6077. datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int team)
  6078. {
  6079. int dir;
  6080. int user_no;
  6081. user_no=(team==0)?sub_p_a:sub_p_b;
  6082. option_info.sub_off=0;
  6083. option_info.sub_on=11;
  6084. while (game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_off].flags&2)
  6085. option_info.sub_off++;
  6086. while (!game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_on].flags&1)
  6087. option_info.sub_on++;
  6088. sub_b=0;
  6089. uf1_p=uf2_p=uf3_p=uf4_p=1;
  6090. do_substitution_menu(team, user_no);
  6091. do
  6092. {
  6093. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6094. main_buff.dump(0,0);
  6095. frame_count();
  6096. } while (slide>0);
  6097. do
  6098. {
  6099. dir=get_dir(user_no);
  6100. if (dir&F1_DIR) sub_b=0;
  6101. if (dir&F2_DIR) sub_b=1;
  6102. if (dir&F3_DIR) sub_b=2;
  6103. if (dir&F4_DIR) sub_b=3;
  6104. if (dir&UP_DIR) (sub_b+=3)%=4;
  6105. if (dir&DOWN_DIR) ++sub_b%=4;
  6106. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6107. main_buff.dump(0,0);
  6108. frame_count();
  6109. if (dir&(FIRE1_DIR|FIRE2_DIR))
  6110. {
  6111. switch(sub_b)
  6112. {
  6113. case 0:
  6114. do
  6115. {
  6116. if (dir&FIRE1_DIR) (++option_info.sub_off%=11);
  6117. else (option_info.sub_off+=10)%=11;
  6118. } while (game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_off].flags&2);
  6119. break;
  6120. case 1:
  6121. sub_player(team,option_info.sub_off,option_info.sub_on);
  6122. SubstituePlayers((team==0)?setup.team_a:setup.team_b,option_info.sub_off,option_info.sub_on);
  6123. goto su_exit;
  6124. case 2:
  6125. goto su_exit;
  6126. case 3:
  6127. do
  6128. {
  6129. if (dir&FIRE1_DIR) { if (++option_info.sub_on>14) option_info.sub_on=11; }
  6130. else { if (--option_info.sub_on<11) option_info.sub_on=14; }
  6131. } while (!game_data[(team==0)?TEMPa:TEMPb].players[option_info.sub_on].flags&1);
  6132. break;
  6133. }
  6134. }
  6135. } while (!keys[1]);
  6136. keys[1]=0;
  6137. su_exit:;
  6138. if (user_no>=0)
  6139. while (users_dir[user_no].f&3)
  6140. get_dir(user_no);
  6141. keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6142. sub_pending&=((team==0)?2:1);
  6143. mcount=1;
  6144. }
  6145. extern char tactics_a,tactics_b;
  6146. extern void load_new_tactics();
  6147. void
  6148. formation(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6149. datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no,int team)
  6150. {
  6151. int dir;
  6152. int oform=option_info.formation;
  6153. for_b=0;
  6154. uf1_p=uf2_p=uf3_p=uf4_p=1;
  6155. do_formation_menu(team, user_no);
  6156. do
  6157. {
  6158. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6159. main_buff.dump(0,0);
  6160. frame_count();
  6161. } while (slide>0);
  6162. do
  6163. {
  6164. dir=get_dir(user_no);
  6165. if (dir&F1_DIR) for_b=0;
  6166. if (dir&F2_DIR) for_b=1;
  6167. if (dir&F3_DIR) for_b=2;
  6168. if (dir&UP_DIR) (for_b+=2)%=3;
  6169. if (dir&DOWN_DIR) ++for_b%=3;
  6170. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6171. main_buff.dump(0,0);
  6172. frame_count();
  6173. if (dir&(FIRE1_DIR|FIRE2_DIR))
  6174. {
  6175. switch(for_b)
  6176. {
  6177. case 0:
  6178. if (dir&FIRE1_DIR) (++option_info.formation%=10);
  6179. else (option_info.formation+=9)%=10;
  6180. break;
  6181. case 1:
  6182. if (team==0) tactics_a=option_info.formation;
  6183. else tactics_b=option_info.formation;
  6184. load_new_tactics();
  6185. goto fo_exit;
  6186. case 2:
  6187. option_info.formation=oform;
  6188. goto fo_exit;
  6189. }
  6190. }
  6191. } while (!keys[1]);
  6192. keys[1]=0;
  6193. if (user_no>=0)
  6194. while (users_dir[user_no].f&3)
  6195. get_dir(user_no);
  6196. keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6197. fo_exit:;
  6198. mcount=1;
  6199. }
  6200. void
  6201. options(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6202. datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr,int user_no,int team)
  6203. {
  6204. int dir;
  6205. opt_b=0;
  6206. uf1_p=uf2_p=uf3_p=uf4_p=1;
  6207. if (replay_seconds==0||!allow_replay) opt_b=3;
  6208. if (user_no<0)
  6209. {
  6210. if (replay_seconds==0||!allow_replay) return;
  6211. sub_c=0;
  6212. }
  6213. else
  6214. {
  6215. sub_c=(game_data[(team==0)?TEMPa:TEMPb].players[11].flags&1);
  6216. sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[12].flags&1);
  6217. sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[13].flags&1);
  6218. sub_c+=(game_data[(team==0)?TEMPa:TEMPb].players[14].flags&1);
  6219. }
  6220. option_info.formation=(team==0)?tactics_a:tactics_b;
  6221. op_loop:
  6222. do_options_menu(team, user_no);
  6223. do
  6224. {
  6225. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6226. main_buff.dump(0,0);
  6227. frame_count();
  6228. } while (slide>0);
  6229. do
  6230. {
  6231. dir=get_dir(user_no);
  6232. if (dir&F1_DIR) if (replay_seconds==0||!allow_replay) dir^=FIRE1_DIR; else opt_b=0;
  6233. if (dir&F2_DIR) if (match_mode||!EUROmatch_info.substitutes||sub_c<2) dir^=FIRE1_DIR; else opt_b=1;
  6234. if (dir&F3_DIR) if (user_no<0) dir^=FIRE1_DIR; else opt_b=2;
  6235. if (dir&F4_DIR) opt_b=3;
  6236. re_opt:;
  6237. if (dir&UP_DIR)
  6238. {
  6239. if (user_no<0 && opt_b==3) { opt_b=2;goto re_opt; }
  6240. if ((match_mode||!EUROmatch_info.substitutes||sub_c<2) && opt_b==2) { opt_b=1;goto re_opt; }
  6241. if ((replay_seconds==0||!allow_replay) && opt_b==1) { opt_b=0;goto re_opt; }
  6242. (opt_b+=3)%=4;
  6243. }
  6244. if (dir&DOWN_DIR)
  6245. {
  6246. if (user_no<0 && opt_b==1) { opt_b=2;goto re_opt; }
  6247. if ((match_mode||!EUROmatch_info.substitutes||sub_c<2) && opt_b==0) { opt_b=1;goto re_opt; }
  6248. if ((replay_seconds==0||!allow_replay) && opt_b==3) { opt_b=0;goto re_opt; }
  6249. ++opt_b%=4;
  6250. }
  6251. render3d(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr);
  6252. main_buff.dump(0,0);
  6253. frame_count();
  6254. if (dir&(FIRE1_DIR|FIRE2_DIR))
  6255. {
  6256. switch(opt_b)
  6257. {
  6258. case 0:
  6259. replay(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no);
  6260. goto op_exit;
  6261. case 1:
  6262. if (team==0)
  6263. {
  6264. sub_pending^=1;
  6265. sub_p_a=user_no;
  6266. }
  6267. else
  6268. {
  6269. sub_pending^=2;
  6270. sub_p_b=user_no;
  6271. }
  6272. // substitution(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no,team);
  6273. goto op_exit;
  6274. case 2:
  6275. formation(buffer,viewx,viewy,viewz,targx,targy,targz,vdist,plyrtb,xyz_ptr,ref_ptr,user_no,team);
  6276. if (for_b==2)
  6277. goto op_loop;
  6278. else
  6279. goto op_exit;
  6280. case 3:
  6281. goto op_exit;
  6282. }
  6283. }
  6284. } while (!keys[1]);
  6285. keys[1]=0;
  6286. op_exit:;
  6287. if (user_no>=0)
  6288. while (users_dir[user_no].f&3)
  6289. get_dir(user_no);
  6290. keys[0x3b]=keys[0x3c]=keys[0x3d]=keys[0x3e]=0;
  6291. mcount=1;
  6292. }
  6293. void
  6294. adjust_menu()
  6295. {
  6296. menu_buff_l[menu-1].buff_hgt=menu_buff_l[menu-1].clip_hgt=mhgt;
  6297. menu_buff_h[menu-1].buff_hgt=menu_buff_h[menu-1].clip_hgt=mhgt<<1;
  6298. menu_buff_l[menu-1].buff_start=MCGA_buff[0].buff_start+(MCGA_buff[0].clip_hgt-menu_buff_l[menu-1].buff_hgt)*MCGA_buff[0].buff_wid+((MCGA_buff[0].clip_wid-menu_buff_l[menu-1].clip_wid)>>1);
  6299. menu_buff_h[menu-1].buff_start=VESA_buff[scrmode-0x100][0].buff_start+(VESA_buff[scrmode-0x100][0].clip_hgt-menu_buff_h[menu-1].buff_hgt)*VESA_buff[scrmode-0x100][0].buff_wid+((VESA_buff[scrmode-0x100][0].clip_wid-menu_buff_h[menu-1].clip_wid)>>1);
  6300. if (scrmode3DB>=0)
  6301. {
  6302. if (scrmode3DB>1)
  6303. menu_buff_l[menu-1].buff_start=buff_3DB[scrmode3DB].buff_start+(buff_3DB[scrmode3DB].clip_hgt-menu_buff_l[menu-1].buff_hgt)*buff_3DB[scrmode3DB].buff_wid+((buff_3DB[scrmode3DB].clip_wid-menu_buff_l[menu-1].clip_wid)>>1);
  6304. else
  6305. menu_buff_h[menu-1].buff_start=buff_3DB[scrmode3DB].buff_start+(buff_3DB[scrmode3DB].clip_hgt-menu_buff_h[menu-1].buff_hgt)*buff_3DB[scrmode3DB].buff_wid+((buff_3DB[scrmode3DB].clip_wid-menu_buff_h[menu-1].clip_wid)>>1);
  6306. }
  6307. if (slide>mhgt-20) slide=oslide=mhgt-20;
  6308. }
  6309. // Remapping gfx for transparency
  6310. remapgfx(int d)
  6311. {
  6312. BYTE *tptr;
  6313. int i;
  6314. tptr=maps[0];
  6315. for (i=0;i<X_BM*65536;i++) *(tptr++)+=d;
  6316. if (setup.M8)
  6317. {
  6318. tptr=maps[S_BM+2];
  6319. #ifdef NEW
  6320. for (i=0;i<6*65536;i++) *(tptr++)+=d;
  6321. #else
  6322. for (i=0;i<5*65536;i++) *(tptr++)+=d;
  6323. #endif
  6324. }
  6325. }
  6326. remapxgfx(int d)
  6327. {
  6328. BYTE *tptr;
  6329. int i,j;
  6330. tptr=maps[X_BM];
  6331. for (i=0;i<116*256;i++) *(tptr++)+=d;
  6332. for (i=116;i<143;i++)
  6333. {
  6334. tptr+=256-188;
  6335. for (j=0;j<188;j++)
  6336. *(tptr++)+=d;
  6337. }
  6338. for (i=143;i<171;i++)
  6339. {
  6340. tptr+=256-79;
  6341. for (j=0;j<79;j++)
  6342. *(tptr++)+=d;
  6343. }
  6344. tptr=maps[X_BM]+180*256;
  6345. for (i=0;i<(76+256)*256;i++)
  6346. {
  6347. if (*tptr>1) *(tptr)+=d;
  6348. tptr++;
  6349. }
  6350. if (setup.stadium>=45&&setup.stadium<90)
  6351. {
  6352. tptr=maps[S_BM]+100*256+197;
  6353. for (j=0;j<90;j++)
  6354. {
  6355. for (i=0;i<59;i++)
  6356. *(tptr++)+=d;
  6357. tptr+=256-59;
  6358. }
  6359. tptr=maps[S_BM]+190*256+220;
  6360. for (j=0;j<35;j++)
  6361. {
  6362. for (i=0;i<36;i++)
  6363. *(tptr++)+=d;
  6364. tptr+=256-36;
  6365. }
  6366. }
  6367. tptr=maps[X_BM+1]+80*256;
  6368. for (i=0;i<256;i++)
  6369. *tptr++=i;
  6370. }
  6371. extern int coo;
  6372. double null;
  6373. obj hd;
  6374. ptlist hdp={ 4, -50,0,-50, 50,0,-50, 50,0,50, -50,0,50 };
  6375. facelist hdf={ 1, 4,-X_TM-2000, 0,3,2,1};
  6376. /************************/
  6377. /* MAIN DISPLAY ROUTINE */
  6378. void render3d(buff_info *buffer,datapt viewx,datapt viewy,datapt viewz,datapt targx,datapt targy,
  6379. datapt targz,datapt vdist,plyrdat *plyrtb,datapt *xyz_ptr,word *ref_ptr)
  6380. {
  6381. short i,j;
  6382. double hr,r;
  6383. mat tmp;
  6384. obj *thisobj;
  6385. objs *oldobj;
  6386. plyrdat *plyrpt;
  6387. plyrtwdat *plyrpto;
  6388. mcap *mc1,*mc2;
  6389. datapt *tw,*tw1,*tw2;
  6390. floatpt twnstp,pt1,pt2;
  6391. short plyrhi;
  6392. static char vidi_l;
  6393. static short balld;
  6394. short an,ano,xf,xfo;
  6395. static short kco=0;
  6396. static short wire=0;
  6397. static float hcoo=0;
  6398. static float fcoo=0;
  6399. float fs,fx,fy;
  6400. BYTE v,ra,rb,*vrnd;
  6401. rotpt rxa[4],rya[4],rza[4];
  6402. rotpt rxb[4],ryb[4],rzb[4];
  6403. float dx1,dy1,dx2,dy2,dz1,dz2;
  6404. float vn,vm,vs1,vs2,vs3,vs4;
  6405. if (vidi_anim&&buffer==&vidi_buff) return;
  6406. if (!kco&buffer!=&vidi_buff)
  6407. {
  6408. if (keys[0x44]&&setup.M8)
  6409. {
  6410. short oscrmode;
  6411. oscrmode=scrmode;
  6412. switchmode();
  6413. if (scrmode3DB<0 && scrmode!=oscrmode)
  6414. {
  6415. ++setup.start_res&=1;
  6416. switch(scrmode)
  6417. {
  6418. case 0x13:
  6419. vclear(scrb+320,320,200,320,5);
  6420. mcgacpy(scrb+320,0,0,320,200,320);
  6421. break;
  6422. case 0x100:
  6423. vclear(scrb+640,640,400,640,5);
  6424. svgacpy(scrb+640,0,0,640,400,640);
  6425. break;
  6426. case 0x101:
  6427. vclear(scrb+640,640,480,640,5);
  6428. svgacpy(scrb+640,0,0,640,480,640);
  6429. break;
  6430. }
  6431. }
  6432. else
  6433. #ifdef BLASTDEMO
  6434. scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  6435. #else
  6436. scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  6437. #endif
  6438. kco=8;
  6439. }
  6440. if (keys[0xc]&&setup.screen_size<SCRSIZES-1&&scrmode3DB<0)
  6441. {
  6442. clearbuffer(buffer,5);
  6443. // buffer->dump(0,0);
  6444. rdmenu=1;
  6445. setup.screen_size++;
  6446. if (scrmode==0x13)
  6447. *buffer=main_buff=MCGA_buff[setup.screen_size];
  6448. else
  6449. {
  6450. i=0;
  6451. while (scrmode!=modelist[i] && ++i!=VESAMODES);
  6452. if (i!=VESAMODES)
  6453. *buffer=main_buff=VESA_buff[i][setup.screen_size];
  6454. }
  6455. kco=8;
  6456. }
  6457. if (keys[0xd]&&setup.screen_size>0)
  6458. {
  6459. clearbuffer(buffer,5);
  6460. // buffer->dump(0,0);
  6461. rdmenu=1;
  6462. setup.screen_size--;
  6463. if (scrmode==0x13)
  6464. *buffer=main_buff=MCGA_buff[setup.screen_size];
  6465. else
  6466. {
  6467. i=0;
  6468. while (scrmode!=modelist[i] && ++i!=VESAMODES);
  6469. if (i!=VESAMODES)
  6470. *buffer=main_buff=VESA_buff[i][setup.screen_size];
  6471. }
  6472. kco=8;
  6473. }
  6474. #ifdef BLASTDEMO
  6475. if (keys[0x0e])
  6476. {
  6477. if (scrmode3DB<0)
  6478. {
  6479. if ((scrmode3DB=Init3DB(setup.start_res==0?modelist3DB:modelist3DBh))>=0)
  6480. {
  6481. #ifdef BLASTDEMO
  6482. scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  6483. #else
  6484. scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  6485. #endif
  6486. remapgfx(-1);
  6487. remapxgfx(-1);
  6488. main_buff=buff_3DB[scrmode3DB];
  6489. pal[3]=pal[4]=pal[5]=63;
  6490. pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  6491. SetPalette3DB(pal);
  6492. }
  6493. }
  6494. else
  6495. {
  6496. Close3DB();
  6497. scrmode3DB=-1;
  6498. remapgfx(1);
  6499. remapxgfx(1);
  6500. if (setup.start_res==0)
  6501. {
  6502. scrmode=0x13;
  6503. VGAmode(scrmode);
  6504. main_buff=MCGA_buff[setup.screen_size];
  6505. }
  6506. else
  6507. {
  6508. testVESA=0;
  6509. scrmode=VESAmode(&modelist[0]);
  6510. switch(scrmode)
  6511. {
  6512. case 0x100:main_buff=VESA_buff[0][setup.screen_size];break;
  6513. case 0x101:main_buff=VESA_buff[1][setup.screen_size];break;
  6514. default:VGAmode(0x13);main_buff=MCGA_buff[setup.screen_size];scrmode=0x13;
  6515. }
  6516. }
  6517. setup.start_res=(scrmode==0x13)?0:1;
  6518. // Set palette
  6519. setpal();
  6520. // Clear screen
  6521. switch(scrmode)
  6522. {
  6523. case 0x13:
  6524. vclear(scrb+320,320,200,320,5);
  6525. mcgacpy(scrb+320,0,0,320,200,320);
  6526. break;
  6527. case 0x100:
  6528. vclear(scrb+640,640,400,640,5);
  6529. svgacpy(scrb+640,0,0,640,400,640);
  6530. break;
  6531. case 0x101:
  6532. vclear(scrb+640,640,480,640,5);
  6533. svgacpy(scrb+640,0,0,640,480,640);
  6534. break;
  6535. }
  6536. }
  6537. kco=8;
  6538. }
  6539. #endif
  6540. if (scrmode3DB<0)
  6541. {
  6542. if (keys[0x3f]) ++setup.detail.pitch%=3,kco=8;
  6543. if (setup.detail.pitch==0&&setup.start_res==1) setup.detail.pitch=1;
  6544. if (keys[0x40]) ++setup.detail.lines&=1,kco=8;
  6545. if (keys[0x41]) ++setup.detail.sky&=1,kco=8;
  6546. if (keys[0x42]) ++setup.detail.players&=1,kco=8;
  6547. // if (keys[0x3f]) ++setup.detail.shadows&=1,kco=8;
  6548. // if (keys[0x10])
  6549. // wire=!wire,kco=8;
  6550. if (EUROmatch_info.tga_enable&&keys[0x43]&&setup.M8)
  6551. {
  6552. for (i=0;i<400;i++)
  6553. memcpy(dumplbm+0x312+(399-i)*640,render_buff.buff_start+640*i,640);
  6554. writebin(dumpstr,dumplbm,640*400+0x312);
  6555. dumpstr[4]++;
  6556. kco=8;
  6557. }
  6558. }
  6559. }
  6560. else
  6561. if (kco&&buffer!=&vidi_buff) kco--;
  6562. // Set extended buffer info
  6563. render_buff.buff_start=buffer->buff_start;
  6564. render_buff.buff_wid=buffer->buff_wid;
  6565. render_buff.buff_hgt=buffer->buff_hgt;
  6566. render_buff.clip_wid=buffer->clip_wid;
  6567. render_buff.clip_hgt=buffer->clip_hgt;
  6568. render_buff.scale_x=buffer->scale_x;
  6569. render_buff.scale_y=buffer->scale_y;
  6570. render_buff.dump=buffer->dump;
  6571. render_buff.clip_endl=buffer->buff_start+buffer->clip_hgt*buffer->buff_wid;
  6572. render_buff.clip_end=render_buff.clip_endl-buffer->buff_wid;
  6573. render_buff.clip_widl=buffer->clip_wid-1;
  6574. render_buff.clip_hgtl=buffer->clip_hgt-1;
  6575. render_buff.clip_xmid=buffer->clip_wid>>1;
  6576. render_buff.clip_ymid=buffer->clip_hgt>>1;
  6577. // Set perspective based info
  6578. oq=vdist;
  6579. q=vdist*((buffer->scale_x+buffer->scale_y)/2);
  6580. qr=(floatpt)1/q;
  6581. qa=(floatpt)q*2/100;
  6582. scrdr=(float)1/SCREENDIST;
  6583. persc=q*scrdr;
  6584. // Prepare viewing vector vars
  6585. viewz=-viewz,targz=-targz;
  6586. targx-=viewx;
  6587. targy-=viewy;
  6588. targz-=viewz;
  6589. hr=targx*targx+targz*targz;
  6590. if (hr<1) hr=1,targz=1;
  6591. r=sqrt(hr+targy*targy);
  6592. hr=sqrt(hr);
  6593. cth=targz/hr;sth=targx/hr;
  6594. cph=hr/r;sph=targy/r;
  6595. if (buffer!=&vidi_buff)
  6596. {
  6597. icth=32767*cth;
  6598. isth=32767*sth;
  6599. }
  6600. // Make global rotation matrix
  6601. matcop(rot.arr,unit);
  6602. matcop(tran.arr,unit);
  6603. matcop(tmp,unit);
  6604. rot.arr[0][3]=-viewx;
  6605. rot.arr[1][3]=-viewy;
  6606. rot.arr[2][3]=-viewz;
  6607. tmp[0][0]=cth;
  6608. tmp[0][2]=-sth;
  6609. tmp[1][0]=-sth*sph;
  6610. tmp[1][1]=cph;
  6611. tmp[1][2]=-cth*sph;
  6612. tmp[2][0]=sth*cph;
  6613. tmp[2][1]=sph;
  6614. tmp[2][2]=cth*cph;
  6615. matmul(rot.arr,tmp);
  6616. clip_tex=NOTEXTURES+1;
  6617. ppt=plyrtb;
  6618. #ifdef COUNT
  6619. numpols=0;
  6620. #endif
  6621. //// Now render all objects from furthest to nearest
  6622. clearlists
  6623. //// GRASS
  6624. if (scrmode3DB<0)
  6625. {
  6626. ground(hr,targy,viewx,viewy,-viewz);
  6627. if (!setup.detail.pitch)
  6628. addobjfc(&pitch);
  6629. }
  6630. else
  6631. {
  6632. ground(hr,targy,viewx,viewy,-viewz);
  6633. // addobjfc(&pitch);
  6634. // dispols3DB();
  6635. }
  6636. //goto hd1;
  6637. //// FAR STANDS
  6638. vn=st_w*rot.e.r22+rot.e.r23;
  6639. vs1=vn*rot.e.r00-(st_w*rot.e.r02+rot.e.r03)*rot.e.r20;
  6640. vn=(-800-st_w)*rot.e.r22+rot.e.r23;
  6641. vs2=vn*rot.e.r00-((-800-st_w)*rot.e.r02+rot.e.r03)*rot.e.r20;
  6642. vn=-st_l*rot.e.r20+rot.e.r23;
  6643. vs3=vn*rot.e.r02-(-st_l*rot.e.r00+rot.e.r03)*rot.e.r22;
  6644. vn=(1280+st_l)*rot.e.r20+rot.e.r23;
  6645. vs4=vn*rot.e.r02-((1280+st_l)*rot.e.r00+rot.e.r03)*rot.e.r22;
  6646. if (setup.stadium<90)
  6647. {
  6648. if (vs3>=0)
  6649. addobjnc(&stad3),numpols+=1000;
  6650. if (vs4<0)
  6651. addobjnc(&stad1),numpols+=1000;
  6652. if (vs1>=0)
  6653. addobjnc(&stad2),numpols+=1000;
  6654. if (vs2<0)
  6655. addobjnc(&stad4),numpols+=1000;
  6656. }
  6657. else
  6658. {
  6659. if (vs1>=0)
  6660. addobjnc(&stad2);
  6661. if (vs2<0)
  6662. addobjnc(&stad4);
  6663. if (vs3>=0)
  6664. addobjnc(&stad3);
  6665. if (vs4<0)
  6666. addobjnc(&stad1);
  6667. }
  6668. if (scrmode3DB<0)
  6669. dispolsn();
  6670. else
  6671. dispolst3DB();
  6672. //// PITCH MARKINGS
  6673. objdepd(&l1,l1_d);
  6674. addobjfc(&l1);
  6675. objdepd(&l2,l2_d);
  6676. addobjfc(&l2);
  6677. objdepd(&l3,l3_d);
  6678. addobjfc(&l3);
  6679. objdepd(&l4,l4_d);
  6680. addobjfc(&l4);
  6681. objdepd(&l5,l5_d);
  6682. addobjfc(&l5);
  6683. objdepd(&l6,l6_d);
  6684. addobjfc(&l6);
  6685. if (setup.detail.lines)
  6686. {
  6687. objdepd(&circle,circle_d);
  6688. addobjfc(&circle);
  6689. objdepd(&semi1,s_circle_d1);
  6690. addobjfc(&semi1);
  6691. objdepd(&semi2,s_circle_d2);
  6692. addobjfc(&semi2);
  6693. }
  6694. addobjfc(&spot1);
  6695. addobjfc(&spot2);
  6696. addobjfc(&spot3);
  6697. //// SHADOWS/HIGHLIGHTS
  6698. // Player shadows
  6699. plyrpt=(plyrdat *)plyrtb;
  6700. for (i=0;i<NPLAYERS;i++)
  6701. {
  6702. if (plyrpt->type&&!plyrpt->htype&&setup.detail.players)
  6703. {
  6704. plhilight[0][0].x=plyrpt->x;
  6705. plhilight[0][0].z=-plyrpt->z;
  6706. addobjfc(&plhilight[0][0]);
  6707. }
  6708. plyrpt++;
  6709. }
  6710. // Ball shadow
  6711. if (!balld)
  6712. {
  6713. ballshad.x=plyrpt->x;
  6714. ballshad.z=-plyrpt->z;
  6715. }
  6716. else
  6717. {
  6718. ballshad.x=mcap_ballx;
  6719. ballshad.z=mcap_bally;
  6720. }
  6721. addobjfc(&ballshad);
  6722. // Draw lines & shadows in order given (no sort).
  6723. if (scrmode3DB<0)
  6724. dispolsnx();
  6725. else
  6726. dispols3DB();
  6727. // Player hilights
  6728. hcoo+=log_factor;
  6729. while (hcoo>=4) hcoo-=4;
  6730. plyrpt=(plyrdat *)plyrtb;
  6731. for (i=0;i<NPLAYERS;i++)
  6732. {
  6733. if (plyrpt->type&&plyrpt->htype)
  6734. {
  6735. if ((plyrpt->htype!=4 && plyrpt->htype!=6) || hcoo>=2)
  6736. {
  6737. plhilight[plyrpt->htype][plyrpt->hcol].x=plyrpt->x;
  6738. plhilight[plyrpt->htype][plyrpt->hcol].z=-plyrpt->z;
  6739. if (plyrpt->htype==3 || plyrpt->htype==4)
  6740. {
  6741. plhilight[plyrpt->htype][plyrpt->hcol].crot=plyrpt->crot;
  6742. plhilight[plyrpt->htype][plyrpt->hcol].srot=-plyrpt->srot;
  6743. addobjyc(&plhilight[plyrpt->htype][plyrpt->hcol]);
  6744. }
  6745. else
  6746. addobjfc(&plhilight[plyrpt->htype][plyrpt->hcol]);
  6747. }
  6748. }
  6749. plyrpt++;
  6750. }
  6751. objs *objtemp=curobj;
  6752. //// PLAYERS
  6753. coo++;
  6754. balld=0;
  6755. thisobj=player;
  6756. plyrpt=plyrtb;
  6757. plyrpto=plyrtwtb;
  6758. for (i=0;i<NPLAYERS;i++)
  6759. {
  6760. // Saying something
  6761. if (plyrpt->sprite>=0)
  6762. {
  6763. // *(xyz_ptr+(int)*xyz_ptr*3+1)=plyrpt->x;
  6764. // *(xyz_ptr+(int)*xyz_ptr*3+2)=plyrpt->y+30;
  6765. // *(xyz_ptr+(int)*xyz_ptr*3+3)=-plyrpt->z;
  6766. // *(ref_ptr+(int)*xyz_ptr)=plyrpt->sprite;
  6767. // (*xyz_ptr)++;
  6768. }
  6769. // Is he on?
  6770. if (plyrpt->type)
  6771. {
  6772. // Set object data
  6773. thisobj->x=plyrpt->x;
  6774. thisobj->y=plyrpt->y;
  6775. thisobj->z=-plyrpt->z;
  6776. thisobj->crot=-plyrpt->crot;
  6777. thisobj->srot=plyrpt->srot;
  6778. // Tweening
  6779. an=plyrpt->anim;
  6780. ano=plyrpto->anim;
  6781. if (xf=(an&1 && an>=MC_BFOOTBL && an<=MC_TROTF))
  6782. mc1=&mcaps[an-1];
  6783. else
  6784. mc1=&mcaps[an];
  6785. if (an!=ano||plyrpto->tween>=0)
  6786. {
  6787. xfo=(ano&1 && ano>=MC_BFOOTBL && ano<=MC_TROTF);
  6788. if (plyrpto->tween<0)
  6789. {
  6790. plyrpto->tween=0;
  6791. plyrpto->tstep=plyrpt->fstep*2*log_factor;
  6792. plyrpto->animto=an;
  6793. }
  6794. else if (plyrpto->animto!=an)
  6795. {
  6796. tw=(plyrpto->twnfrm=plyrpto->twnpts2)+1;
  6797. tw1=plyrpto->twnpts1+1;
  6798. for (j=PLYRPTS*3;j;j--)
  6799. *(tw++)=*(tw1++);
  6800. plyrpto->tween=0;
  6801. plyrpto->tstep=plyrpt->fstep*2*log_factor;
  6802. plyrpto->anim=ano=plyrpto->animto;
  6803. plyrpto->animto=an;
  6804. xfo=(ano&1 && ano>=MC_BFOOTBL && ano<=MC_TROTF);
  6805. }
  6806. plyrpto->tween+=plyrpto->tstep;
  6807. if (plyrpto->tween>=1)
  6808. {
  6809. plyrpto->tween=-1;
  6810. thisobj->points=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)];
  6811. plyrpto->twnfrm=thisobj->points;
  6812. plyrpto->anim=plyrpto->animto;
  6813. }
  6814. else
  6815. {
  6816. tw1=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)]+1;
  6817. tw2=plyrpto->twnfrm+1;
  6818. tw=(thisobj->points=plyrpto->twnpts1)+1;
  6819. if ((xf&&!xfo)||(!xf&&xfo))
  6820. {
  6821. pt1=plyrpto->tween;
  6822. pt2=1-pt1;
  6823. tw[0*3] =tw1[0*3] *pt1+tw2[0*3] *pt2;
  6824. tw[0*3+1]=tw1[0*3+1]*pt1+tw2[0*3+1]*pt2;
  6825. tw[0*3+2]=tw1[0*3+2]*pt1-tw2[0*3+2]*pt2;
  6826. tw[1*3] =tw1[1*3] *pt1+tw2[1*3] *pt2;
  6827. tw[1*3+1]=tw1[1*3+1]*pt1+tw2[1*3+1]*pt2;
  6828. tw[1*3+2]=tw1[1*3+2]*pt1-tw2[1*3+2]*pt2;
  6829. tw[2*3] =tw1[2*3] *pt1+tw2[2*3] *pt2;
  6830. tw[2*3+1]=tw1[2*3+1]*pt1+tw2[2*3+1]*pt2;
  6831. tw[2*3+2]=tw1[2*3+2]*pt1-tw2[2*3+2]*pt2;
  6832. tw[3*3] =tw1[3*3] *pt1+tw2[3*3] *pt2;
  6833. tw[3*3+1]=tw1[3*3+1]*pt1+tw2[3*3+1]*pt2;
  6834. tw[3*3+2]=tw1[3*3+2]*pt1-tw2[3*3+2]*pt2;
  6835. tw[4*3] =tw1[4*3] *pt1+tw2[4*3] *pt2;
  6836. tw[4*3+1]=tw1[4*3+1]*pt1+tw2[4*3+1]*pt2;
  6837. tw[4*3+2]=tw1[4*3+2]*pt1-tw2[4*3+2]*pt2;
  6838. tw[5*3] =tw1[5*3] *pt1+tw2[8*3] *pt2;
  6839. tw[5*3+1]=tw1[5*3+1]*pt1+tw2[8*3+1]*pt2;
  6840. tw[5*3+2]=tw1[5*3+2]*pt1-tw2[8*3+2]*pt2;
  6841. tw[6*3] =tw1[6*3] *pt1+tw2[9*3] *pt2;
  6842. tw[6*3+1]=tw1[6*3+1]*pt1+tw2[9*3+1]*pt2;
  6843. tw[6*3+2]=tw1[6*3+2]*pt1-tw2[9*3+2]*pt2;
  6844. tw[7*3] =tw1[7*3] *pt1+tw2[10*3] *pt2;
  6845. tw[7*3+1]=tw1[7*3+1]*pt1+tw2[10*3+1]*pt2;
  6846. tw[7*3+2]=tw1[7*3+2]*pt1-tw2[10*3+2]*pt2;
  6847. tw[8*3] =tw1[8*3] *pt1+tw2[5*3] *pt2;
  6848. tw[8*3+1]=tw1[8*3+1]*pt1+tw2[5*3+1]*pt2;
  6849. tw[8*3+2]=tw1[8*3+2]*pt1-tw2[5*3+2]*pt2;
  6850. tw[9*3] =tw1[9*3] *pt1+tw2[6*3] *pt2;
  6851. tw[9*3+1]=tw1[9*3+1]*pt1+tw2[6*3+1]*pt2;
  6852. tw[9*3+2]=tw1[9*3+2]*pt1-tw2[6*3+2]*pt2;
  6853. tw[10*3] =tw1[10*3] *pt1+tw2[7*3] *pt2;
  6854. tw[10*3+1]=tw1[10*3+1]*pt1+tw2[7*3+1]*pt2;
  6855. tw[10*3+2]=tw1[10*3+2]*pt1-tw2[7*3+2]*pt2;
  6856. tw[11*3] =tw1[11*3] *pt1+tw2[12*3] *pt2;
  6857. tw[11*3+1]=tw1[11*3+1]*pt1+tw2[12*3+1]*pt2;
  6858. tw[11*3+2]=tw1[11*3+2]*pt1-tw2[12*3+2]*pt2;
  6859. tw[12*3] =tw1[12*3] *pt1+tw2[11*3] *pt2;
  6860. tw[12*3+1]=tw1[12*3+1]*pt1+tw2[11*3+1]*pt2;
  6861. tw[12*3+2]=tw1[12*3+2]*pt1-tw2[11*3+2]*pt2;
  6862. tw[13*3] =tw1[13*3] *pt1+tw2[17*3] *pt2;
  6863. tw[13*3+1]=tw1[13*3+1]*pt1+tw2[17*3+1]*pt2;
  6864. tw[13*3+2]=tw1[13*3+2]*pt1-tw2[17*3+2]*pt2;
  6865. tw[14*3] =tw1[14*3] *pt1+tw2[18*3] *pt2;
  6866. tw[14*3+1]=tw1[14*3+1]*pt1+tw2[18*3+1]*pt2;
  6867. tw[14*3+2]=tw1[14*3+2]*pt1-tw2[18*3+2]*pt2;
  6868. tw[15*3] =tw1[15*3] *pt1+tw2[19*3] *pt2;
  6869. tw[15*3+1]=tw1[15*3+1]*pt1+tw2[19*3+1]*pt2;
  6870. tw[15*3+2]=tw1[15*3+2]*pt1-tw2[19*3+2]*pt2;
  6871. tw[17*3] =tw1[17*3] *pt1+tw2[13*3] *pt2;
  6872. tw[17*3+1]=tw1[17*3+1]*pt1+tw2[13*3+1]*pt2;
  6873. tw[17*3+2]=tw1[17*3+2]*pt1-tw2[13*3+2]*pt2;
  6874. tw[18*3] =tw1[18*3] *pt1+tw2[14*3] *pt2;
  6875. tw[18*3+1]=tw1[18*3+1]*pt1+tw2[14*3+1]*pt2;
  6876. tw[18*3+2]=tw1[18*3+2]*pt1-tw2[14*3+2]*pt2;
  6877. tw[19*3] =tw1[19*3] *pt1+tw2[15*3] *pt2;
  6878. tw[19*3+1]=tw1[19*3+1]*pt1+tw2[15*3+1]*pt2;
  6879. tw[19*3+2]=tw1[19*3+2]*pt1-tw2[15*3+2]*pt2;
  6880. tw[16*3] =tw1[16*3] *pt1+tw2[20*3] *pt2;
  6881. tw[16*3+1]=tw1[16*3+1]*pt1+tw2[20*3+1]*pt2;
  6882. tw[16*3+2]=tw1[16*3+2]*pt1-tw2[20*3+2]*pt2;
  6883. tw[20*3] =tw1[20*3] *pt1+tw2[16*3] *pt2;
  6884. tw[20*3+1]=tw1[20*3+1]*pt1+tw2[16*3+1]*pt2;
  6885. tw[20*3+2]=tw1[20*3+2]*pt1-tw2[16*3+2]*pt2;
  6886. tw[21*3] =tw1[21*3] *pt1+tw2[22*3] *pt2;
  6887. tw[21*3+1]=tw1[21*3+1]*pt1+tw2[22*3+1]*pt2;
  6888. tw[21*3+2]=tw1[21*3+2]*pt1-tw2[22*3+2]*pt2;
  6889. tw[22*3] =tw1[22*3] *pt1+tw2[21*3] *pt2;
  6890. tw[22*3+1]=tw1[22*3+1]*pt1+tw2[21*3+1]*pt2;
  6891. tw[22*3+2]=tw1[22*3+2]*pt1-tw2[21*3+2]*pt2;
  6892. if (tw2[23*3+1]<0)
  6893. {
  6894. tw[23*3] =tw1[23*3];
  6895. tw[23*3+1]=tw1[23*3+1];
  6896. tw[23*3+2]=tw1[23*3+2];
  6897. }
  6898. else
  6899. {
  6900. tw[23*3] =tw1[23*3] *pt1+tw2[23*3] *pt2;
  6901. tw[23*3+1]=tw1[23*3+1]*pt1+tw2[23*3+1]*pt2;
  6902. tw[23*3+2]=tw1[23*3+2]*pt1-tw2[23*3+2]*pt2;
  6903. }
  6904. tw[24*3] =tw1[24*3] *pt1+tw2[25*3] *pt2;
  6905. tw[24*3+1]=tw1[24*3+1]*pt1+tw2[25*3+1]*pt2;
  6906. tw[24*3+2]=tw1[24*3+2]*pt1-tw2[25*3+2]*pt2;
  6907. tw[25*3] =tw1[25*3] *pt1+tw2[24*3] *pt2;
  6908. tw[25*3+1]=tw1[25*3+1]*pt1+tw2[24*3+1]*pt2;
  6909. tw[25*3+2]=tw1[25*3+2]*pt1-tw2[24*3+2]*pt2;
  6910. tw[26*3] =tw1[26*3] *pt1+tw2[27*3] *pt2;
  6911. tw[26*3+1]=tw1[26*3+1]*pt1+tw2[27*3+1]*pt2;
  6912. tw[26*3+2]=tw1[26*3+2]*pt1-tw2[27*3+2]*pt2;
  6913. tw[27*3] =tw1[27*3] *pt1+tw2[26*3] *pt2;
  6914. tw[27*3+1]=tw1[27*3+1]*pt1+tw2[26*3+1]*pt2;
  6915. tw[27*3+2]=tw1[27*3+2]*pt1-tw2[26*3+2]*pt2;
  6916. }
  6917. else
  6918. {
  6919. pt1=plyrpto->tween;
  6920. pt2=1-pt1;
  6921. for (j=PLYRPTS*3;j;j--)
  6922. *(tw++)=*(tw1++)*pt1+*(tw2++)*pt2;
  6923. }
  6924. }
  6925. }
  6926. else
  6927. // No tween
  6928. {
  6929. thisobj->points=player_p[mc1->cappts+(short)(plyrpt->frame*mc1->capfrms)];
  6930. plyrpto->twnfrm=thisobj->points;
  6931. plyrpto->anim=an;
  6932. }
  6933. // Motion captured ball
  6934. if (thisobj->points[1+23*3+1]>=0)
  6935. {
  6936. ball.y=-thisobj->points[1+23*3];
  6937. if (xf)
  6938. ball.z=-thisobj->points[1+23*3+2];
  6939. else
  6940. ball.z=thisobj->points[1+23*3+2];
  6941. ball.x=-ball.y*thisobj->crot+ball.z*thisobj->srot+thisobj->x;
  6942. ball.z=ball.y*thisobj->srot+ball.z*thisobj->crot+thisobj->z;
  6943. ball.y=thisobj->points[1+23*3+1]+thisobj->y;
  6944. balld=1;
  6945. // (ANDYF) Grab motion capture coordinates of ball...
  6946. mcap_ballx=0;//ball.x;
  6947. mcap_bally=0;//ball.z;
  6948. mcap_ballz=0;//ball.y;
  6949. }
  6950. // Wire frame mode
  6951. if (wire)
  6952. thisobj->faces=playertypes[11];
  6953. else
  6954. {
  6955. // Is he a goalie
  6956. if (xf)
  6957. if (i==0||i==11)
  6958. { thisobj->faces=playertypes[(plyrpt->type==1||!setup.M8)?10:20]; }
  6959. else
  6960. if (game_data[plyrpt->type==1?TEMPa:TEMPb].players[i%11].skin_tone&&setup.M8)
  6961. thisobj->faces=playertypes[(short)plyrpt->type+15];
  6962. else
  6963. thisobj->faces=playertypes[(short)plyrpt->type+5];
  6964. else
  6965. if (i==0||i==11)
  6966. { thisobj->faces=playertypes[(plyrpt->type==1||!setup.M8)?5:15]; }
  6967. else
  6968. if (game_data[plyrpt->type==1?TEMPa:TEMPb].players[i%11].skin_tone&&setup.M8)
  6969. thisobj->faces=playertypes[(short)plyrpt->type+10];
  6970. else
  6971. thisobj->faces=playertypes[(short)plyrpt->type];
  6972. if (thisobj->faces==player_fl&&!setup.M8)
  6973. thisobj->faces=player_fr;
  6974. // Player number
  6975. if (i<22)
  6976. if (setup.detail.players)
  6977. {
  6978. thisobj->faces[0]=13;
  6979. if (plyrpt->type==1)
  6980. thisobj->faces[82]=-X_TM-2016-(plyrpt->number-1);
  6981. else
  6982. thisobj->faces[82]=-X_TM-2016-15-(plyrpt->number-1);
  6983. }
  6984. else
  6985. thisobj->faces[0]=12;
  6986. }
  6987. //plyrpt->frame=modf(plyrpt->frame+(float)1/mc1->capfrms,&null);
  6988. // Draw object
  6989. if (objdep(*thisobj)>15)
  6990. {
  6991. oldobj=curobj;
  6992. if (xf)
  6993. addobjyf(thisobj);
  6994. else
  6995. addobjy(thisobj);
  6996. if (oldobj!=curobj) sortobj(oldobj);
  6997. }
  6998. thisobj++;
  6999. }
  7000. plyrpt++;
  7001. plyrpto++;
  7002. }
  7003. //// BALL
  7004. if (!balld)
  7005. {
  7006. ball.x=plyrpt->x;
  7007. ball.y=plyrpt->y;
  7008. ball.z=-plyrpt->z;
  7009. }
  7010. ball.crot=plyrpt->crot;
  7011. ball.srot=plyrpt->srot;
  7012. objdepd(&ball,ball_d);
  7013. addobjxy(&ball,plyrpt->frame,plyrpt->fstep);
  7014. plyrpt++;
  7015. //// GOALS
  7016. oldobj=curobj;
  7017. objdepd(&goal1_1,goal1_a);
  7018. addobjnc(&goal1_1);
  7019. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7020. objdepd(&goal2_1,goal2_a);
  7021. addobjnc(&goal2_1);
  7022. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7023. objdepd(&goal3_1,goal3_a);
  7024. addobjnc(&goal3_1);
  7025. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7026. objdepd(&goal4_1,goal4_a);
  7027. addobjnc(&goal4_1);
  7028. oldobj=curobj;
  7029. objdepd(&goal1_2,goal1_b);
  7030. addobjnc(&goal1_2);
  7031. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7032. objdepd(&goal2_2,goal2_b);
  7033. addobjnc(&goal2_2);
  7034. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7035. objdepd(&goal3_2,goal3_b);
  7036. addobjnc(&goal3_2);
  7037. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7038. objdepd(&goal4_2,goal4_b);
  7039. addobjnc(&goal4_2);
  7040. //// FLAGS
  7041. if (setup.detail.lines)
  7042. {
  7043. oldobj=curobj;
  7044. addobjnc(&flag_1);
  7045. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7046. addobjnc(&flag_2);
  7047. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7048. addobjnc(&flag_3);
  7049. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7050. addobjnc(&flag_4);
  7051. if (oldobj!=curobj) {sortobj(oldobj);oldobj++;}
  7052. }
  7053. //// SPRITES
  7054. if (buffer==&main_buff)
  7055. addobjsp(xyz_ptr,ref_ptr);
  7056. // Sort objects from z value
  7057. qsort(objtemp,curobj-objtemp,sizeof(objs),objcmp);
  7058. // Sort and render players, ball, goals and sprites.
  7059. if (scrmode3DB<0)
  7060. dispolsn();
  7061. else
  7062. dispolst3DB();
  7063. // Set up pt lists for 3D Blaster
  7064. curpts3DB=&Vertex[0];
  7065. curtex3DB=&Texture[0];
  7066. //// SCANNER
  7067. if (key_togs[0xf]&&buffer!=&vidi_buff)
  7068. if (scrmode==0x13)
  7069. {
  7070. scrpt scanner_l[]={8,56, 44,56, 44,8, 8,8};
  7071. if (scrmode3DB<0)
  7072. polyf((pnt *)scanner_l,4,filters[0]);
  7073. else
  7074. rectshadow3DB(buffer,8,render_buff.clip_hgt-56,36,48);
  7075. draw_sprite(buffer,88,9,buffer->clip_hgt-55,0);
  7076. plyrpt=(plyrdat *)plyrtb;
  7077. for (i=0;i<22;i++)
  7078. {
  7079. if (plyrpt->type)
  7080. draw_sprite(buffer,89+(((i<11&&(!(match_half&1)))||(i>=11&&(match_half&1)))?0:2),8+(plyrpt->z*34)/800,buffer->clip_hgt-10-(plyrpt->x*46)/1280,0);
  7081. plyrpt++;
  7082. }
  7083. plyrpt+=3;
  7084. draw_sprite(buffer,89,8+(plyrpt->z*34)/800,buffer->clip_hgt-10-(ball.x*46)/1280,31);
  7085. }
  7086. else
  7087. {
  7088. scrpt scanner_h[]={16,112, 88,112, 88,16, 16,16};
  7089. if (scrmode3DB<0)
  7090. polyf((pnt *)scanner_h,4,filters[0]);
  7091. else
  7092. rectshadow3DB(buffer,16,render_buff.clip_hgt-112,72,96);
  7093. draw_sprite_d(buffer,88,18,buffer->clip_hgt-110,0);
  7094. plyrpt=(plyrdat *)plyrtb;
  7095. for (i=0;i<22;i++)
  7096. {
  7097. if (plyrpt->type)
  7098. draw_sprite(buffer,90+(((i<11&&(!(match_half&1)))||(i>=11&&(match_half&1)))?0:2),15+2*(plyrpt->z*34)/800,buffer->clip_hgt-21-2*(plyrpt->x*46)/1280,0);
  7099. plyrpt++;
  7100. }
  7101. plyrpt+=3;
  7102. draw_sprite(buffer,89,16+2*(plyrpt->z*34)/800,buffer->clip_hgt-20-2*(ball.x*46)/1280,31);
  7103. }
  7104. //// ANIMATE TEXTURES
  7105. if (0)//setup.M8&&vidi_anim)
  7106. // if (setup.M8&&vidi_anim)
  7107. if (spool)
  7108. switch(vidi_anim)
  7109. {
  7110. case 1: do_extra_time_anim(spool); break;
  7111. case 2: do_foul_anim(spool); break;
  7112. case 3: do_full_time_anim(spool); break;
  7113. case 4: do_half_time_anim(spool); break;
  7114. case 5: do_penalty_anim(spool); break;
  7115. case 6: do_goal_anim(spool); break;
  7116. case 7: do_win_f_anim(spool); break;
  7117. case 9: do_win_g_anim(spool); break;
  7118. case 11: do_win_s_anim(spool); break;
  7119. }
  7120. else
  7121. do_anim(vidi);
  7122. if (wind_on)
  7123. {
  7124. fcoo+=log_factor;
  7125. if (fcoo>=(128-wind_speed)/10)
  7126. {
  7127. if (flag_f[1+5*6+1]==-X_TM-2048)
  7128. flag_f[1+5*6+1]=flag_f[1+5*6+6]=-X_TM-2046;
  7129. else
  7130. flag_f[1+5*6+1]=--flag_f[1+5*6+6];
  7131. fcoo=0;
  7132. }
  7133. fs=(PI/2)*(wind_speed+16)/144;
  7134. fx=8.5*sin(fs)+1;
  7135. fy=8.5*cos(fs);
  7136. flag_p[1+8*3]=fx*wind_x;
  7137. flag_p[1+8*3+1]=15-fy;
  7138. flag_p[1+8*3+2]=fx*wind_y;
  7139. }
  7140. else
  7141. {
  7142. flag_p[1+8*3]=1.751;
  7143. flag_p[1+8*3+1]=6.629;
  7144. flag_p[1+8*3+2]=1.751;
  7145. }
  7146. if (menu&&buffer!=&vidi_buff)
  7147. {
  7148. slco+=log_factor*5;
  7149. if (mcount>0)
  7150. if (slide>0) while (slco>=1&&slide>0) slco--,slide--;
  7151. else while (slco>=1) slco--,mcount--;
  7152. else
  7153. {
  7154. while (slco>=1&&slide<oslide) slco--,slide++;
  7155. if (slide>=oslide) menu=0,rdmenu=1;
  7156. }
  7157. if (scrmode==0x13)
  7158. {
  7159. menx3DB=menu_buff_l[menu-1].scale_x;
  7160. meny3DB=menu_buff_l[menu-1].scale_y+(slide+12+(menu==22?10:0));
  7161. #ifdef BLASTDEMO
  7162. if (scrmode3DB==1) meny3DB+=40;
  7163. #endif
  7164. menu_buff.buff_start=menu_buff_l[menu-1].buff_start+MCGA_buff[0].buff_wid*(slide+12+(menu==22?10:0));
  7165. menu_buff.buff_wid=menu_buff_l[menu-1].buff_wid;
  7166. menu_buff.buff_hgt=menu_buff_l[menu-1].buff_hgt;
  7167. menu_buff.clip_wid=menu_buff_l[menu-1].clip_wid;
  7168. menu_buff.clip_hgt=menu_buff_l[menu-1].clip_hgt-(slide+12);
  7169. }
  7170. else
  7171. {
  7172. menx3DB=menu_buff_h[menu-1].scale_x+(scrmode3DB==5?80:0);
  7173. meny3DB=menu_buff_h[menu-1].scale_y+((slide+12+(menu==22?10:0))<<1);
  7174. if (scrmode3DB>=0)
  7175. {
  7176. switch (scrmode3DB)
  7177. {
  7178. case 2:meny3DB-=50;break;
  7179. case 4:meny3DB+=80;break;
  7180. case 5:meny3DB+=200;break;
  7181. }
  7182. menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7183. }
  7184. else
  7185. if (scrmode!=0x101)
  7186. menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7187. else
  7188. menu_buff.buff_start=menu_buff_h[menu-1].buff_start+VESA_buff[scrmode==0x100?0:1][0].buff_wid*((slide+12+(menu==22?10:0))<<1);
  7189. menu_buff.buff_wid=menu_buff_h[menu-1].buff_wid;
  7190. menu_buff.buff_hgt=menu_buff_h[menu-1].buff_hgt;
  7191. menu_buff.clip_wid=menu_buff_h[menu-1].clip_wid;
  7192. menu_buff.clip_hgt=menu_buff_h[menu-1].clip_hgt-((slide+12)<<1);
  7193. }
  7194. switch (menu)
  7195. {
  7196. case 1:
  7197. goal_menu(&menu_buff, mdata1, mdata2, mdata3);
  7198. break;
  7199. case 2:
  7200. booked_menu(&menu_buff, mdata1, mdata2);
  7201. break;
  7202. case 3:
  7203. off_menu(&menu_buff, mdata1, mdata2);
  7204. break;
  7205. case 4:
  7206. direct_menu(&menu_buff, mdata1);
  7207. break;
  7208. case 5:
  7209. indirect_menu(&menu_buff, mdata1);
  7210. break;
  7211. case 6:
  7212. penalty_menu(&menu_buff, mdata1);
  7213. break;
  7214. case 7:
  7215. corner_menu(&menu_buff, mdata1);
  7216. break;
  7217. case 8:
  7218. throw_menu(&menu_buff, mdata1);
  7219. break;
  7220. case 9:
  7221. goalkick_menu(&menu_buff, mdata1);
  7222. break;
  7223. case 10:
  7224. kickoff_menu(&menu_buff, mdata1);
  7225. break;
  7226. case 11:
  7227. offside_menu(&menu_buff, mdata1);
  7228. break;
  7229. case 12:
  7230. injured_menu(&menu_buff, mdata1, mdata2);
  7231. break;
  7232. case 13:
  7233. fulltime_menu(&menu_buff);
  7234. adjust_menu();
  7235. break;
  7236. case 14:
  7237. extratime_menu(&menu_buff);
  7238. adjust_menu();
  7239. break;
  7240. case 15:
  7241. halftime_menu(&menu_buff);
  7242. adjust_menu();
  7243. break;
  7244. case 16:
  7245. penalty_shootout_menu(&menu_buff);
  7246. adjust_menu();
  7247. break;
  7248. case 17:
  7249. final_score_menu(&menu_buff);
  7250. adjust_menu();
  7251. break;
  7252. case 18:
  7253. owngoal_menu(&menu_buff, mdata1, mdata2, mdata3);
  7254. break;
  7255. case 19:
  7256. options_menu(&menu_buff, mdata1, mdata2);
  7257. break;
  7258. case 20:
  7259. formation_menu(&menu_buff, mdata1, mdata2);
  7260. break;
  7261. case 21:
  7262. substitution_menu(&menu_buff, mdata1, mdata2);
  7263. break;
  7264. case 22:
  7265. replay_menu(&menu_buff, mdata1);
  7266. break;
  7267. case 23:
  7268. ref_menu(&menu_buff);
  7269. break;
  7270. case 24:
  7271. stats_menu(&menu_buff);
  7272. break;
  7273. }
  7274. }
  7275. if (key_togs[0x0a])
  7276. vidi_l=1;
  7277. else
  7278. {
  7279. if (vidi_l)
  7280. stop_anim(vidi);
  7281. vidi_l=0;
  7282. }
  7283. if (buffer!=&vidi_buff)
  7284. {
  7285. char tstr[50];
  7286. int mid=buffer->clip_wid>>1;
  7287. int end=buffer->clip_hgt;
  7288. menx3DB=meny3DB=0;
  7289. if (menu<19||menu>22)
  7290. if (match_time.secs<10)
  7291. sprintf(tstr,"%d:0%d",match_time.min,(int)match_time.secs);
  7292. else
  7293. sprintf(tstr,"%d:%2d",match_time.min,(int)match_time.secs);
  7294. else
  7295. switch(menu)
  7296. {
  7297. case 19: sprintf(tstr,GetTEXT( OPTN_TEXT )); break;
  7298. case 20: sprintf(tstr,GetTEXT( FRMN_TEXT )); break;
  7299. case 21: sprintf(tstr,GetTEXT( SBTN_TEXT )); break;
  7300. case 22: sprintf(tstr,GetTEXT( RPLY_TEXT )); break;
  7301. }
  7302. if (scrmode==0x13)
  7303. {
  7304. draw_string(buffer,1,mid,1,tstr,31,2);
  7305. if (!menu)
  7306. {
  7307. // draw_string(&MCGA_buff[0],end-8,140,0,EUROmatch_info.TeamAname,31,1);
  7308. i=draw_string(buffer,1,mid-20,end-8,EUROmatch_info.TeamAname,32,1);
  7309. if (sub_pending&1) draw_sprite(buffer,84,mid-20-i-16,end-16,0);
  7310. sprintf(tstr,"%d=%d",team_a_goals,team_b_goals);
  7311. draw_string(buffer,1,mid,end-8,tstr,31,2);
  7312. i=draw_string(buffer,1,mid+20,end-8,EUROmatch_info.TeamBname,56,0);
  7313. if (sub_pending&2) draw_sprite(buffer,85,mid+20+i+2,end-16,0);
  7314. }
  7315. }
  7316. else
  7317. {
  7318. draw_string(buffer,2,mid,1,tstr,31,2);
  7319. if (!menu)
  7320. {
  7321. // draw_string(&VESA_buff[0][0],end-14,mid-40,0,EUROmatch_info.TeamAname,31,1);
  7322. i=draw_string(buffer,2,mid-40,end-14,EUROmatch_info.TeamAname,32,1);
  7323. if (sub_pending&1) draw_sprite(buffer,86,mid-40-i-20,end-20,0);
  7324. sprintf(tstr,"%d=%d",team_a_goals,team_b_goals);
  7325. draw_string(buffer,2,mid,end-14,tstr,31,2);
  7326. i=draw_string(buffer,2,mid+40,end-14,EUROmatch_info.TeamBname,56,0);
  7327. if (sub_pending&2) draw_sprite(buffer,87,mid+40+i+4,end-20,0);
  7328. }
  7329. }
  7330. #ifdef BLASTDEMO
  7331. char prbuf[20];
  7332. static float cl=0;
  7333. static int cnt,clk,oldclk;
  7334. cnt++;
  7335. if (20==cnt)
  7336. {
  7337. cnt=0;
  7338. clk=clock();
  7339. cl=(20.*CLOCKS_PER_SEC)/(clk-oldclk);
  7340. oldclk=clock();
  7341. }
  7342. draw_string(&main_buff,2,0,0,gcvt(cl,3,prbuf),31,0);
  7343. #endif
  7344. }
  7345. if (scrmode3DB>=0&&curpts3DB!=Vertex)
  7346. {
  7347. SetRectangleOutput3DB(texaddr3DB[0]);
  7348. Render3DB(curpts3DB-Vertex);
  7349. }
  7350. }
  7351. /************************/
  7352. /* BUFFER DUMP ROUTINES */
  7353. int spin=25;
  7354. void dumpMCGAs(scrpt dispx,scrpt dispy)
  7355. {
  7356. int x;
  7357. int y;
  7358. char* scr_=(char*) 0xa0000,*scr_end;
  7359. char* scr_buf=(char *)render_buff.buff_start;
  7360. float scr_off,scr_stp;
  7361. scr_stp=100*cos(spin*3.1416/50);
  7362. scr_+=32000-((int)scr_stp)*320;
  7363. if (!scr_stp) scr_stp=200;
  7364. else scr_stp=100/scr_stp;
  7365. if (scr_stp>=0)
  7366. {
  7367. scr_end=(char *)0xa0000;
  7368. while (scr_end<scr_)
  7369. {
  7370. memset(scr_end,0,320);
  7371. scr_end+=320;
  7372. }
  7373. while ((y=(int)scr_off)<200)
  7374. {
  7375. for (x=0;x<320;x++)
  7376. *(scr_++)=*(scr_buf+y*320+x);
  7377. scr_off+=scr_stp;
  7378. }
  7379. while (scr_<(char *)0xafa00)
  7380. {
  7381. memset(scr_,0,320);
  7382. scr_+=320;
  7383. }
  7384. }
  7385. else
  7386. {
  7387. scr_end=(char *)0xafa00;
  7388. while (scr_end!=scr_)
  7389. {
  7390. scr_end-=320;
  7391. memset(scr_end,0,320);
  7392. }
  7393. while ((y=(int)scr_off)>-200)
  7394. {
  7395. for (x=0;x<320;x++)
  7396. *(scr_++)=*(scr_buf-y*320+x);
  7397. scr_-=640;
  7398. scr_off+=scr_stp;
  7399. }
  7400. while (scr_>=(char *)0xa0000)
  7401. {
  7402. memset(scr_,0,320);
  7403. scr_-=320;
  7404. }
  7405. }
  7406. spin++;
  7407. }
  7408. // Dump main buffer to MCGA
  7409. void dumpMCGA(scrpt dispx,scrpt dispy)
  7410. {
  7411. int mx,my,mw,mh;
  7412. BYTE *tptr;
  7413. if (!rdmenu)
  7414. {
  7415. dispx=(320-render_buff.clip_wid)>>1;
  7416. dispy=(200-render_buff.clip_hgt)>>1;
  7417. mcgacpy(render_buff.buff_start,dispx,dispy,render_buff.clip_wid,render_buff.clip_hgt,render_buff.buff_wid);
  7418. }
  7419. else
  7420. {
  7421. mcgacpy(scrb+320,0,0,320,200,320);
  7422. rdmenu=0;
  7423. }
  7424. if (menu && setup.screen_size)
  7425. {
  7426. mx=(320-menu_buff.clip_wid)>>1;
  7427. my=((menu_buff.buff_start-mx)-MCGA_buff[0].buff_start)/320;
  7428. if (menu_buff.clip_wid>render_buff.clip_wid)
  7429. {
  7430. mw=(menu_buff.clip_wid-render_buff.clip_wid)>>1;
  7431. mh=menu_buff.clip_hgt;
  7432. mcgacpy(menu_buff.buff_start,mx,my,mw,mh,320);
  7433. vclear(menu_buff.buff_start,mw,mh,320,5);
  7434. mcgacpy(menu_buff.buff_start+menu_buff.clip_wid-mw,mx+menu_buff.clip_wid-mw,my,mw,mh,320);
  7435. vclear(menu_buff.buff_start+menu_buff.clip_wid-mw,mw,mh,320,5);
  7436. }
  7437. mw=render_buff.clip_wid;
  7438. mh=(200-render_buff.clip_hgt)>>1;
  7439. mx=(320-render_buff.clip_wid)>>1;
  7440. my=200-mh;
  7441. tptr=MCGA_buff[0].buff_start+my*320+mx;
  7442. mcgacpy(tptr,mx,my,mw,mh,320);
  7443. vclear(tptr,mw,mh,320,5);
  7444. }
  7445. }
  7446. // Dump general VESA 256-colour buffer to SVGA
  7447. void dumpV256(scrpt dispx,scrpt dispy)
  7448. {
  7449. int mx,my,mw,mh;
  7450. BYTE *tptr;
  7451. if (!rdmenu)
  7452. {
  7453. dispx=(render_buff.buff_wid-render_buff.clip_wid)>>1;
  7454. dispy=(render_buff.buff_hgt-render_buff.clip_hgt)>>1;
  7455. svgacpy(render_buff.buff_start,dispx,dispy,render_buff.clip_wid,render_buff.clip_hgt,render_buff.buff_wid);
  7456. }
  7457. else
  7458. {
  7459. if (scrmode==0x100)
  7460. svgacpy(scrb+640,0,0,640,400,640);
  7461. else
  7462. svgacpy(scrb+640,0,0,640,480,640);
  7463. rdmenu=0;
  7464. }
  7465. if (menu && setup.screen_size)
  7466. {
  7467. mx=(640-menu_buff.clip_wid)>>1;
  7468. my=((menu_buff.buff_start-mx)-VESA_buff[scrmode==0x100?0:1][0].buff_start)/640;
  7469. if (menu_buff.clip_wid>render_buff.clip_wid)
  7470. {
  7471. mw=(menu_buff.clip_wid-render_buff.clip_wid)>>1;
  7472. mh=menu_buff.clip_hgt;
  7473. svgacpy(menu_buff.buff_start,mx,my,mw,mh,640);
  7474. vclear(menu_buff.buff_start,mw,mh,640,5);
  7475. svgacpy(menu_buff.buff_start+menu_buff.clip_wid-mw,mx+menu_buff.clip_wid-mw,my,mw,mh,640);
  7476. vclear(menu_buff.buff_start+menu_buff.clip_wid-mw,mw,mh,640,5);
  7477. }
  7478. mw=render_buff.clip_wid;
  7479. mh=(VESA_buff[scrmode==0x100?0:1][0].clip_hgt-render_buff.clip_hgt)>>1;
  7480. mx=(640-render_buff.clip_wid)>>1;
  7481. my=VESA_buff[scrmode==0x100?0:1][0].clip_hgt-mh;
  7482. tptr=VESA_buff[scrmode==0x100?0:1][0].buff_start+my*640+mx;
  7483. svgacpy(tptr,mx,my,mw,mh,640);
  7484. vclear(tptr,mw,mh,640,5);
  7485. }
  7486. }
  7487. // Null dump routine
  7488. void dumpnull(scrpt dispx,scrpt dispy) {}
  7489. // 3d Blaster dump routine
  7490. void dump3DB(scrpt dispx,scrpt dispy)
  7491. {
  7492. SwapBuffer3DB();
  7493. // ClearBuffer3DB();
  7494. }
  7495. // Dump vidi buffer to map page through filter (already there)
  7496. void dumpvidi1(scrpt dispx,scrpt dispy)
  7497. {
  7498. BYTE *scrpt;
  7499. short i,j;
  7500. if (vidi_anim) return;
  7501. scrpt=render_buff.buff_start;
  7502. for (i=0;i<render_buff.clip_hgt;i++)
  7503. {
  7504. for (j=0;j<render_buff.clip_wid;j++)
  7505. {
  7506. *scrpt=filters[1][*scrpt];
  7507. scrpt++;
  7508. }
  7509. scrpt+=render_buff.buff_wid-render_buff.clip_wid;
  7510. }
  7511. }
  7512. /********************************/
  7513. /* INITIALISE DISPLAY & OBJECTS */
  7514. word getselectors(word noselectors)
  7515. {
  7516. union REGS regs;
  7517. regs.w.cx=noselectors;
  7518. regs.w.ax=0;
  7519. int386(0x31,&regs,&regs);
  7520. if (regs.w.cflag&1)
  7521. {
  7522. puts("Error allocating selectors");
  7523. return(-1);
  7524. }
  7525. return(regs.w.ax);
  7526. }
  7527. int setselector(word selector, BYTE *address, dword length)
  7528. {
  7529. union REGS regs;
  7530. if (w95) address-=0x10000;
  7531. regs.w.dx=(dword)address%65536;
  7532. regs.w.cx=(dword)address/65536;
  7533. regs.w.bx=selector;
  7534. regs.w.ax=7;
  7535. int386(0x31,&regs,&regs);
  7536. if (regs.w.cflag&1)
  7537. {
  7538. puts("Error preparing selectors");
  7539. return(-1);
  7540. }
  7541. regs.w.dx=(length-1)%65536;
  7542. regs.w.cx=(length-1)/65536;
  7543. regs.w.bx=selector;
  7544. regs.w.ax=8;
  7545. int386(0x31,&regs,&regs);
  7546. if (regs.w.cflag&1)
  7547. {
  7548. printf("Error preparing selectors");
  7549. return(-1);
  7550. }
  7551. return(0);
  7552. }
  7553. int freeselector(word selector)
  7554. {
  7555. union REGS regs;
  7556. regs.w.bx=selector;
  7557. regs.w.ax=1;
  7558. int386(0x31,&regs,&regs);
  7559. if (regs.w.cflag&1)
  7560. {
  7561. puts("Error freeing selectors");
  7562. return(-1);
  7563. }
  7564. return(0);
  7565. }
  7566. word nextselectordisp(word selector)
  7567. {
  7568. union REGS regs;
  7569. regs.w.ax=3;
  7570. int386(0x31,&regs,&regs);
  7571. return(regs.w.ax);
  7572. }
  7573. // Object 'constructor' function
  7574. void initobj(obj *object,ptlist points,facelist faces,datapt x,datapt y,datapt z,floatpt crot,floatpt srot)
  7575. {
  7576. object->points=points;
  7577. object->faces=faces;
  7578. object->x=x;
  7579. object->y=y;
  7580. object->z=z;
  7581. object->crot=crot;
  7582. object->srot=srot;
  7583. };
  7584. int skyno;
  7585. int init3d()
  7586. {
  7587. int i,j,mc_tot;
  7588. word selector;
  7589. BYTE *seg;
  7590. BYTE *tptr,*tptr2;
  7591. word *stp;
  7592. dword *tlptr;
  7593. maps=NULL,scrb=NULL,sky=NULL,textures=NULL,filters=NULL,player_p=NULL,plyrtwtb=NULL;
  7594. objlist=NULL,pollist=NULL,ptslist=NULL,rotlist=NULL,anim_data=NULL;
  7595. fd=NULL;
  7596. for (i=0;i<MAPPAGES+noloop+2;i++)
  7597. mapsel[i]=-1;
  7598. // Free memory?
  7599. if (setup.verbose) {printf("Free memory = %d\n",get_mem_info());fflush(stdout);}
  7600. // Malloc data areas
  7601. if (setup.verbose) {puts("Preparing memory areas...");fflush(stdout);}
  7602. if (setup.M8)
  7603. mcaps=mcaps8;
  7604. else
  7605. mcaps=mcaps4;
  7606. mc_tot=0;
  7607. for (i=0;i<MC_NO;i++)
  7608. {
  7609. mcaps[i].cappts=mc_tot;
  7610. mc_tot+=mcaps[i].capfrms;
  7611. }
  7612. if (setup.verbose) {printf("Motion capture frames: %d\n",mc_tot);fflush(stdout);}
  7613. if (setup.M8)
  7614. {
  7615. if (
  7616. (maps=(mappage *)mallocx((mappages=MAPPAGES)*65536)) == NULL ||
  7617. (scrb=(BYTE *)mallocx(640*482)) == NULL ||
  7618. (sky=(BYTE *)mallocx(640*482)) == NULL ||
  7619. (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  7620. (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  7621. (player_p=(capfrm *)mallocx(mc_tot*sizeof(capfrm))) == NULL ||
  7622. (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  7623. (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  7624. (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  7625. (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  7626. (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL ||
  7627. (anim_data=(char *)mallocx(ANIM_SPACE)) == NULL )
  7628. {
  7629. puts("Error reserving memory");
  7630. goto init3d_error;
  7631. }
  7632. }
  7633. else
  7634. {
  7635. setup.start_res=0;
  7636. if (
  7637. (maps=(mappage *)mallocx((mappages=MAPPAGES_4)*65536)) == NULL ||
  7638. (scrb=(BYTE *)mallocx(320*202)) == NULL ||
  7639. (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  7640. (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  7641. (player_p=(capfrm *)mallocx(mc_tot*sizeof(capfrm))) == NULL ||
  7642. (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  7643. (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  7644. (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  7645. (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  7646. (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL )
  7647. {
  7648. puts("Error reserving memory");
  7649. goto init3d_error;
  7650. }
  7651. }
  7652. // Load texture maps and other files
  7653. if (setup.verbose) {puts("Reading data files...");fflush(stdout);}
  7654. if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto init3d_error;
  7655. if (opendatafile(datafile) < 0 ) goto init3d_error;
  7656. if (setup.detail.stadia||network_on)
  7657. {
  7658. if (network_on)
  7659. {
  7660. setup.detail.stadia=1;
  7661. setup.stadium+=45;
  7662. }
  7663. else
  7664. if (stadlist[setup.stadium+90].tmdfile==-1||performance<=18)
  7665. setup.stadium+=45;
  7666. else
  7667. setup.stadium+=90;
  7668. }
  7669. #ifdef LINK
  7670. skyno=stadlist[setup.stadium].skytypes[(count&1)?1:0];
  7671. #else
  7672. skyno=stadlist[setup.stadium].skytypes[(rand()&1)?1:0];
  7673. #endif
  7674. if (setup.M8)
  7675. {
  7676. if (
  7677. readfile(PAL_FOOTY,pal) == NULL ||
  7678. readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL
  7679. )
  7680. goto init3d_error;
  7681. if (
  7682. readfile(teamlist[setup.team_a].headfile,maps[0]) == NULL ||
  7683. readfile(teamlist[setup.team_b].headfile,maps[0]+128*256) == NULL ||
  7684. readfile(teamlist[setup.team_a].torsofile,maps[1]) == NULL ||
  7685. readfile(teamlist[setup.team_b_kit].torsofile,maps[2]) == NULL ||
  7686. readfile(teamlist[setup.team_a].limbsfile,maps[3]) == NULL ||
  7687. readfile(teamlist[setup.team_b_kit].limbsfile,maps[3]+80*256) == NULL ||
  7688. readfile(BM_FEET,maps[3]+158*256) == NULL ||
  7689. readfile(BM_REFKPTOR,maps[4]) == NULL ||
  7690. readfile(BM_EXTRA1,maps[X_BM]) == NULL ||
  7691. readfile(teamlist[setup.team_a].nosfile,maps[X_BM]+62*256) == NULL ||
  7692. readfile(BM_EXTRA3,maps[X_BM+1]) == NULL ||
  7693. readfile(stadlist[setup.stadium].sb1file,maps[S_BM]) == NULL ||
  7694. readfile(stadlist[setup.stadium].sb2file,maps[S_BM+1]) == NULL ||
  7695. readfile(teamlist[setup.team_a].torsofile,maps[S_BM+2]) == NULL ||
  7696. readfile(teamlist[setup.team_b_kit].torsofile,maps[S_BM+3]) == NULL ||
  7697. readfile(BM_XLIMBS,maps[S_BM+4]) == NULL ||
  7698. readfile(teamlist[setup.team_a].limbsfile,maps[S_BM+4]) == NULL ||
  7699. readfile(teamlist[setup.team_b_kit].limbsfile,maps[S_BM+4]+80*256) == NULL ||
  7700. readfile(BM_XRFKPLIM,maps[S_BM+5]) == NULL ||
  7701. readfile(BM_REFKPTOR,maps[S_BM+6]) == NULL ||
  7702. #ifdef NEW
  7703. readfile(BM_NETS,maps[S_BM+7]) == NULL ||
  7704. #endif
  7705. readfile(teamlist[setup.team_a].palfile,&pal[3*32]) == NULL ||
  7706. readfile(teamlist[setup.team_b_kit].palfile,&pal[3*56]) == NULL ||
  7707. readfile(teamlist[setup.team_a].skinfile,&pal[3*80]) == NULL ||
  7708. readfile(teamlist[setup.team_b].skinfile,&pal[3*88]) == NULL ||
  7709. readfile(stadlist[setup.stadium].pitchpfile,&pal[3*128]) == NULL ||
  7710. readfile(teamlist[setup.team_a].homepfile,&pal[3*224]) == NULL ||
  7711. readfile(teamlist[setup.team_b].awaypfile,&pal[3*232]) == NULL ||
  7712. readfile(skylist[skyno].skypfile,&pal[3*208]) == NULL ||
  7713. readfile(skylist[skyno].skyfile,sky) == NULL
  7714. )
  7715. goto init3d_error;
  7716. int st_a0;
  7717. int st_b0_kit;
  7718. // st_a0=14;//setup.team_a?36:14;
  7719. // st_b0_kit=36;//setup.team_b_kit?36:14;
  7720. st_a0=setup.team_a;
  7721. st_b0_kit=setup.team_b_kit;
  7722. switch(st_a0/42)
  7723. {
  7724. case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  7725. #ifndef BBS
  7726. case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  7727. #endif
  7728. }
  7729. j=st_a0%42;
  7730. tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  7731. tptr2=maps[X_BM+1]+111*256+220;
  7732. for (i=0;i<40;i++)
  7733. {
  7734. memcpy(tptr2,tptr,35);
  7735. tptr+=256;
  7736. tptr2+=256;
  7737. }
  7738. switch(st_b0_kit/42)
  7739. {
  7740. case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  7741. #ifndef BBS
  7742. case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  7743. #endif
  7744. }
  7745. j=st_b0_kit%42;
  7746. tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  7747. tptr2=maps[X_BM+1]+151*256+220;
  7748. for (i=0;i<40;i++)
  7749. {
  7750. memcpy(tptr2,tptr,35);
  7751. tptr+=256;
  7752. tptr2+=256;
  7753. }
  7754. switch(st_a0/9)
  7755. {
  7756. case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  7757. #ifndef BBS
  7758. case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  7759. case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  7760. case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  7761. case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  7762. case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  7763. #endif
  7764. }
  7765. j=st_a0%9;
  7766. tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  7767. tptr2=maps[X_BM+1];
  7768. for (i=0;i<79;i++)
  7769. {
  7770. memcpy(tptr2,tptr,69);
  7771. tptr+=256;
  7772. tptr2+=256;
  7773. }
  7774. switch(st_b0_kit/9)
  7775. {
  7776. case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  7777. #ifndef BBS
  7778. case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  7779. case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  7780. case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  7781. case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  7782. case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  7783. #endif
  7784. }
  7785. j=st_b0_kit%9;
  7786. tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  7787. tptr2=maps[X_BM+1]+69;
  7788. for (i=0;i<79;i++)
  7789. {
  7790. memcpy(tptr2,tptr,69);
  7791. tptr+=256;
  7792. tptr2+=256;
  7793. }
  7794. if (readfile(BM_REFKPLIM,maps[5]) == NULL) goto init3d_error;
  7795. tptr=maps[X_BM]+89*256+161;
  7796. for (i=0;i<27;i++)
  7797. {
  7798. memcpy(tptr+91*256,tptr,92);
  7799. tptr+=256;
  7800. }
  7801. if (readfile(teamlist[setup.team_b_kit].nosfile,maps[X_BM]+89*256) == NULL) exit (1);
  7802. tptr=maps[X_BM]+116*256+161;
  7803. for (i=0;i<27;i++)
  7804. {
  7805. memcpy(tptr+64*256-92,tptr,92);
  7806. tptr+=256;
  7807. }
  7808. if (readfile(stadlist[setup.stadium].pitchfile,maps[X_BM]+116*256) == NULL) exit (1);
  7809. tptr=maps[X_BM]+180*256+69;
  7810. for (i=0;i<27;i++)
  7811. {
  7812. memcpy(tptr-64*256,tptr,184);
  7813. tptr+=256;
  7814. }
  7815. if (readfile(BM_EXTRA2,maps[X_BM]+180*256) == NULL) exit (1);
  7816. if (
  7817. readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  7818. readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  7819. readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  7820. readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  7821. readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  7822. readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  7823. readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  7824. readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  7825. readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  7826. )
  7827. goto init3d_error;
  7828. if (
  7829. readfile(MPB_AFOOTB,(BYTE *)&player_p[mcaps[MC_AFOOTB].cappts]) == NULL ||
  7830. readfile(MPB_AFOOTC,(BYTE *)&player_p[mcaps[MC_AFOOTC].cappts]) == NULL ||
  7831. readfile(MPB_ABODYB,(BYTE *)&player_p[mcaps[MC_ABODYB].cappts]) == NULL ||
  7832. readfile(MPB_ABODYC,(BYTE *)&player_p[mcaps[MC_ABODYC].cappts]) == NULL ||
  7833. readfile(MPB_AHEADB,(BYTE *)&player_p[mcaps[MC_AHEADB].cappts]) == NULL ||
  7834. readfile(MPB_AHEADC,(BYTE *)&player_p[mcaps[MC_AHEADC].cappts]) == NULL ||
  7835. readfile(MPB_AJUMPB,(BYTE *)&player_p[mcaps[MC_AJUMPB].cappts]) == NULL ||
  7836. readfile(MPB_AJUMPC,(BYTE *)&player_p[mcaps[MC_AJUMPC].cappts]) == NULL ||
  7837. readfile(MPB_BFOOTB,(BYTE *)&player_p[mcaps[MC_BFOOTBL].cappts]) == NULL ||
  7838. readfile(MPB_BFOOTC,(BYTE *)&player_p[mcaps[MC_BFOOTCL].cappts]) == NULL ||
  7839. readfile(MPB_BBODYB,(BYTE *)&player_p[mcaps[MC_BBODYBL].cappts]) == NULL ||
  7840. readfile(MPB_BBODYC,(BYTE *)&player_p[mcaps[MC_BBODYCL].cappts]) == NULL ||
  7841. readfile(MPB_BHEADB,(BYTE *)&player_p[mcaps[MC_BHEADBL].cappts]) == NULL ||
  7842. readfile(MPB_BHEADC,(BYTE *)&player_p[mcaps[MC_BHEADCL].cappts]) == NULL ||
  7843. readfile(MPB_BJUMPB,(BYTE *)&player_p[mcaps[MC_BJUMPBL].cappts]) == NULL ||
  7844. readfile(MPB_CFOOTB,(BYTE *)&player_p[mcaps[MC_CFOOTBL].cappts]) == NULL ||
  7845. readfile(MPB_CFOOTC,(BYTE *)&player_p[mcaps[MC_CFOOTCL].cappts]) == NULL ||
  7846. readfile(MPB_CBODYB,(BYTE *)&player_p[mcaps[MC_CBODYBL].cappts]) == NULL ||
  7847. readfile(MPB_CBODYC,(BYTE *)&player_p[mcaps[MC_CBODYCL].cappts]) == NULL ||
  7848. readfile(MPB_CHEADB,(BYTE *)&player_p[mcaps[MC_CHEADBL].cappts]) == NULL ||
  7849. readfile(MPB_CJUMPB,(BYTE *)&player_p[mcaps[MC_CJUMPBL].cappts]) == NULL ||
  7850. readfile(MPB_SHOOT1,(BYTE *)&player_p[mcaps[MC_SHOOTR].cappts]) == NULL ||
  7851. readfile(MPB_CHIP1,(BYTE *)&player_p[mcaps[MC_CHIPR].cappts]) == NULL ||
  7852. readfile(MPB_SPASS1,(BYTE *)&player_p[mcaps[MC_PASSR].cappts]) == NULL ||
  7853. readfile(MPB_CROSS1,(BYTE *)&player_p[mcaps[MC_CROSSR].cappts]) == NULL ||
  7854. readfile(MPB_VOLLEY,(BYTE *)&player_p[mcaps[MC_VOLLEYR].cappts]) == NULL ||
  7855. // readfile(MPB_TOE2,(BYTE *)&player_p[mcaps[MC_TOER].cappts]) == NULL ||
  7856. readfile(MPB_DIAGPASS,(BYTE *)&player_p[mcaps[MC_DIAGPASSR].cappts]) == NULL ||
  7857. readfile(MPB_DIAGBACK,(BYTE *)&player_p[mcaps[MC_DIAGBACKR].cappts]) == NULL ||
  7858. readfile(MPB_SIDEPASS,(BYTE *)&player_p[mcaps[MC_SIDEPASSR].cappts]) == NULL ||
  7859. readfile(MPB_BACKHEEL,(BYTE *)&player_p[mcaps[MC_BACKHEELR].cappts]) == NULL ||
  7860. readfile(MPB_SVTOSTD,(BYTE *)&player_p[mcaps[MC_STOSL].cappts]) == NULL ||
  7861. readfile(MPB_SVTOSTB,(BYTE *)&player_p[mcaps[MC_STOSBL].cappts]) == NULL ||
  7862. readfile(MPB_TRAP,(BYTE *)&player_p[mcaps[MC_TRAPR].cappts]) == NULL ||
  7863. readfile(MPB_RIDE4,(BYTE *)&player_p[mcaps[MC_RIDEL].cappts]) == NULL ||
  7864. readfile(MPB_SOCKS2,(BYTE *)&player_p[mcaps[MC_SOCKSR].cappts]) == NULL ||
  7865. readfile(MPB_TROTB,(BYTE *)&player_p[mcaps[MC_TROTB].cappts]) == NULL ||
  7866. readfile(MPB_TROTG,(BYTE *)&player_p[mcaps[MC_TROTG].cappts]) == NULL ||
  7867. readfile(MPB_TROTD1,(BYTE *)&player_p[mcaps[MC_TROTD].cappts]) == NULL ||
  7868. readfile(MPB_TROTA,(BYTE *)&player_p[mcaps[MC_TROTA].cappts]) == NULL ||
  7869. readfile(MPB_TROTE,(BYTE *)&player_p[mcaps[MC_TROTE].cappts]) == NULL ||
  7870. readfile(MPB_RUN2,(BYTE *)&player_p[mcaps[MC_RUN].cappts]) == NULL ||
  7871. readfile(MPB_JOG1,(BYTE *)&player_p[mcaps[MC_JOG].cappts]) == NULL ||
  7872. readfile(MPB_BARGE,(BYTE *)&player_p[mcaps[MC_BARGE].cappts]) == NULL ||
  7873. readfile(MPB_THROWW,(BYTE *)&player_p[mcaps[MC_THROWW].cappts]) == NULL ||
  7874. // readfile(MPB_SHAMEW,(BYTE *)&player_p[mcaps[MC_SHAMEW].cappts]) == NULL ||
  7875. // readfile(MPB_LIE1,(BYTE *)&player_p[mcaps[MC_LIE].cappts]) == NULL ||
  7876. readfile(MPB_STAND1,(BYTE *)&player_p[mcaps[MC_STAND].cappts]) == NULL ||
  7877. readfile(MPB_SHEADER,(BYTE *)&player_p[mcaps[MC_S_HEAD].cappts]) == NULL ||
  7878. readfile(MPB_JHEADER,(BYTE *)&player_p[mcaps[MC_J_HEAD].cappts]) == NULL ||
  7879. readfile(MPB_HDOWN1,(BYTE *)&player_p[mcaps[MC_D_HEAD].cappts]) == NULL ||
  7880. // readfile(MPB_HEADUP,(BYTE *)&player_p[mcaps[MC_U_HEAD].cappts]) == NULL ||
  7881. readfile(MPB_DHEADER,(BYTE *)&player_p[mcaps[MC_DV_HEAD].cappts]) == NULL ||
  7882. readfile(MPB_CHEST1,(BYTE *)&player_p[mcaps[MC_CHEST].cappts]) == NULL ||
  7883. readfile(MPB_STACKLE,(BYTE *)&player_p[mcaps[MC_S_TACKLE].cappts]) == NULL ||
  7884. readfile(MPB_STEAL2,(BYTE *)&player_p[mcaps[MC_STEAL].cappts]) == NULL ||
  7885. readfile(MPB_OVERHEAD,(BYTE *)&player_p[mcaps[MC_OVERHEAD].cappts]) == NULL ||
  7886. readfile(MPB_THROWL,(BYTE *)&player_p[mcaps[MC_THROWL].cappts]) == NULL ||
  7887. readfile(MPB_THROWS,(BYTE *)&player_p[mcaps[MC_THROWS].cappts]) == NULL ||
  7888. readfile(MPB_FALLR,(BYTE *)&player_p[mcaps[MC_FALLR].cappts]) == NULL ||
  7889. // readfile(MPB_FALLS,(BYTE *)&player_p[mcaps[MC_FALLS].cappts]) == NULL ||
  7890. readfile(MPB_CELEB,(BYTE *)&player_p[mcaps[MC_CELEB].cappts]) == NULL ||
  7891. // readfile(MPB_SHAME1,(BYTE *)&player_p[mcaps[MC_SHAME].cappts]) == NULL ||
  7892. readfile(MPB_GETUP,(BYTE *)&player_p[mcaps[MC_GETUP].cappts]) == NULL ||
  7893. readfile(MPB_GETUPF,(BYTE *)&player_p[mcaps[MC_GETUPF].cappts]) == NULL ||
  7894. readfile(MPB_STANDB,(BYTE *)&player_p[mcaps[MC_STANDB].cappts]) == NULL ||
  7895. readfile(MPB_BOUNCE,(BYTE *)&player_p[mcaps[MC_BOUNCE].cappts]) == NULL ||
  7896. readfile(MPB_KICKOUT,(BYTE *)&player_p[mcaps[MC_KICKOUT].cappts]) == NULL ||
  7897. readfile(MPB_HALFVOLL,(BYTE *)&player_p[mcaps[MC_HALFVOLL].cappts]) == NULL ||
  7898. readfile(MPB_THROW,(BYTE *)&player_p[mcaps[MC_THROW].cappts]) == NULL ||
  7899. readfile(MPB_ROLL,(BYTE *)&player_p[mcaps[MC_ROLL].cappts]) == NULL ||
  7900. readfile(MPB_RUNWITHB,(BYTE *)&player_p[mcaps[MC_RUNWITHB].cappts]) == NULL ||
  7901. readfile(MPB_WAVEUP,(BYTE *)&player_p[mcaps[MC_WAVEUP].cappts]) == NULL ||
  7902. // readfile(MPB_PENALTY,(BYTE *)&player_p[mcaps[MC_PENALTY].cappts]) == NULL ||
  7903. // readfile(MPB_PLEAD,(BYTE *)&player_p[mcaps[MC_PLEAD].cappts]) == NULL ||
  7904. readfile(MPB_CRTOSTB1,(BYTE *)&player_p[mcaps[MC_CRTOSTB].cappts]) == NULL ||
  7905. readfile(MPB_PICKBALL,(BYTE *)&player_p[mcaps[MC_PICKBALL].cappts]) == NULL
  7906. #ifdef NEW
  7907. || readfile(MPB_DUCK,(BYTE *)&player_p[mcaps[MC_DUCK].cappts]) == NULL ||
  7908. readfile(MPB_FINGER,(BYTE *)&player_p[mcaps[MC_FINGER].cappts]) == NULL ||
  7909. readfile(MPB_KNEE,(BYTE *)&player_p[mcaps[MC_KNEE].cappts]) == NULL ||
  7910. readfile(MPB_PLANE,(BYTE *)&player_p[mcaps[MC_PLANE].cappts]) == NULL ||
  7911. readfile(MPB_MILLER,(BYTE *)&player_p[mcaps[MC_MILLER].cappts]) == NULL ||
  7912. readfile(MPB_BABY,(BYTE *)&player_p[mcaps[MC_BABY].cappts]) == NULL ||
  7913. readfile(MPB_MOON,(BYTE *)&player_p[mcaps[MC_MOON].cappts]) == NULL ||
  7914. readfile(MPB_PUMP,(BYTE *)&player_p[mcaps[MC_PUMP].cappts]) == NULL ||
  7915. readfile(MPB_REEVES,(BYTE *)&player_p[mcaps[MC_REEVES].cappts]) == NULL
  7916. #endif
  7917. )
  7918. goto init3d_error;
  7919. }
  7920. else
  7921. {
  7922. if (
  7923. readfile(PAL_FOOTY,pal) == NULL ||
  7924. readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL
  7925. )
  7926. goto init3d_error;
  7927. if (
  7928. readfile(teamlist[setup.team_a].headfile,maps[0]) == NULL ||
  7929. readfile(teamlist[setup.team_b].headfile,maps[0]+128*256) == NULL ||
  7930. readfile(teamlist[setup.team_a].torsofile,maps[1]) == NULL ||
  7931. readfile(teamlist[setup.team_b_kit].torsofile,maps[2]) == NULL ||
  7932. readfile(teamlist[setup.team_a].limbsfile,maps[3]) == NULL ||
  7933. readfile(teamlist[setup.team_b_kit].limbsfile,maps[3]+80*256) == NULL ||
  7934. readfile(BM_FEET,maps[3]+158*256) == NULL ||
  7935. readfile(BM_REFKPTOR,maps[4]) == NULL ||
  7936. readfile(BM_EXTRA1,maps[X_BM]) == NULL ||
  7937. readfile(teamlist[setup.team_a].nosfile,maps[X_BM]+62*256) == NULL ||
  7938. readfile(BM_EXTRA3,maps[X_BM+1]) == NULL ||
  7939. readfile(stadlist[setup.stadium].sb1file,maps[S_BM]) == NULL ||
  7940. readfile(stadlist[setup.stadium].sb2file,maps[S_BM+1]) == NULL ||
  7941. readfile(teamlist[setup.team_a].palfile,&pal[3*32]) == NULL ||
  7942. readfile(teamlist[setup.team_b_kit].palfile,&pal[3*56]) == NULL ||
  7943. readfile(teamlist[setup.team_a].skinfile,&pal[3*80]) == NULL ||
  7944. readfile(teamlist[setup.team_b].skinfile,&pal[3*88]) == NULL ||
  7945. readfile(stadlist[setup.stadium].pitchpfile,&pal[3*128]) == NULL ||
  7946. readfile(teamlist[setup.team_a].homepfile,&pal[3*224]) == NULL ||
  7947. readfile(teamlist[setup.team_b].awaypfile,&pal[3*232]) == NULL
  7948. )
  7949. goto init3d_error;
  7950. int st_a1;
  7951. int st_b1_kit;
  7952. // st_a1=14;//setup.team_a?36:14;
  7953. // st_b1_kit=36;//setup.team_b_kit?36:14;
  7954. st_a1=setup.team_a;
  7955. st_b1_kit=setup.team_b_kit;
  7956. switch(st_a1/42)
  7957. {
  7958. case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  7959. #ifndef BBS
  7960. case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  7961. #endif
  7962. }
  7963. j=st_a1%42;
  7964. tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  7965. tptr2=maps[X_BM+1]+111*256+220;
  7966. for (i=0;i<40;i++)
  7967. {
  7968. memcpy(tptr2,tptr,35);
  7969. tptr+=256;
  7970. tptr2+=256;
  7971. }
  7972. switch(st_b1_kit/42)
  7973. {
  7974. case 0: if (readfile(BM_KGRIDS1,maps[5])==NULL) goto init3d_error; break;
  7975. #ifndef BBS
  7976. case 1: if (readfile(BM_KGRIDS2,maps[5])==NULL) goto init3d_error; break;
  7977. #endif
  7978. }
  7979. j=st_b1_kit%42;
  7980. tptr=maps[5]+((j/7)*42+1)*256+(j%7)*36+1;
  7981. tptr2=maps[X_BM+1]+151*256+220;
  7982. for (i=0;i<40;i++)
  7983. {
  7984. memcpy(tptr2,tptr,35);
  7985. tptr+=256;
  7986. tptr2+=256;
  7987. }
  7988. switch(st_a1/9)
  7989. {
  7990. case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  7991. #ifndef BBS
  7992. case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  7993. case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  7994. case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  7995. case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  7996. case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  7997. #endif
  7998. }
  7999. j=st_a1%9;
  8000. tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8001. tptr2=maps[X_BM+1];
  8002. for (i=0;i<79;i++)
  8003. {
  8004. memcpy(tptr2,tptr,69);
  8005. tptr+=256;
  8006. tptr2+=256;
  8007. }
  8008. switch(st_b1_kit/9)
  8009. {
  8010. case 0: if (readfile(BM_KGRID1,maps[5])==NULL) goto init3d_error; break;
  8011. #ifndef BBS
  8012. case 1: if (readfile(BM_KGRID2,maps[5])==NULL) goto init3d_error; break;
  8013. case 2: if (readfile(BM_KGRID3,maps[5])==NULL) goto init3d_error; break;
  8014. case 3: if (readfile(BM_KGRID4,maps[5])==NULL) goto init3d_error; break;
  8015. case 4: if (readfile(BM_KGRID5,maps[5])==NULL) goto init3d_error; break;
  8016. case 5: if (readfile(BM_KGRID6,maps[5])==NULL) goto init3d_error; break;
  8017. #endif
  8018. }
  8019. j=st_b1_kit%9;
  8020. tptr=maps[5]+((j/3)*83+2)*256+(j%3)*70+1;
  8021. tptr2=maps[X_BM+1]+69;
  8022. for (i=0;i<79;i++)
  8023. {
  8024. memcpy(tptr2,tptr,69);
  8025. tptr+=256;
  8026. tptr2+=256;
  8027. }
  8028. if (readfile(BM_REFKPLIM,maps[5]) == NULL) goto init3d_error;
  8029. tptr=maps[X_BM]+89*256+161;
  8030. for (i=0;i<27;i++)
  8031. {
  8032. memcpy(tptr+91*256,tptr,92);
  8033. tptr+=256;
  8034. }
  8035. if (readfile(teamlist[setup.team_b_kit].nosfile,maps[X_BM]+89*256) == NULL) exit (1);
  8036. tptr=maps[X_BM]+116*256+161;
  8037. for (i=0;i<27;i++)
  8038. {
  8039. memcpy(tptr+64*256-92,tptr,92);
  8040. tptr+=256;
  8041. }
  8042. if (readfile(stadlist[setup.stadium].pitchfile,maps[X_BM]+116*256) == NULL) exit (1);
  8043. tptr=maps[X_BM]+180*256+69;
  8044. for (i=0;i<27;i++)
  8045. {
  8046. memcpy(tptr-64*256,tptr,184);
  8047. tptr+=256;
  8048. }
  8049. if (readfile(BM_EXTRA2,maps[X_BM]+180*256) == NULL) exit (1);
  8050. if (
  8051. readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  8052. readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  8053. readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  8054. readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  8055. readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  8056. readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  8057. readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  8058. readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  8059. readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  8060. )
  8061. goto init3d_error;
  8062. if (
  8063. readfile(MP4_AFOOTB,(BYTE *)&player_p[mcaps[MC_AFOOTB].cappts]) == NULL ||
  8064. readfile(MP4_AFOOTC,(BYTE *)&player_p[mcaps[MC_AFOOTC].cappts]) == NULL ||
  8065. readfile(MP4_ABODYB,(BYTE *)&player_p[mcaps[MC_ABODYB].cappts]) == NULL ||
  8066. readfile(MP4_ABODYC,(BYTE *)&player_p[mcaps[MC_ABODYC].cappts]) == NULL ||
  8067. readfile(MP4_AHEADB,(BYTE *)&player_p[mcaps[MC_AHEADB].cappts]) == NULL ||
  8068. readfile(MP4_AHEADC,(BYTE *)&player_p[mcaps[MC_AHEADC].cappts]) == NULL ||
  8069. readfile(MP4_AJUMPB,(BYTE *)&player_p[mcaps[MC_AJUMPB].cappts]) == NULL ||
  8070. readfile(MP4_AJUMPC,(BYTE *)&player_p[mcaps[MC_AJUMPC].cappts]) == NULL ||
  8071. readfile(MP4_BFOOTB,(BYTE *)&player_p[mcaps[MC_BFOOTBL].cappts]) == NULL ||
  8072. readfile(MP4_BFOOTC,(BYTE *)&player_p[mcaps[MC_BFOOTCL].cappts]) == NULL ||
  8073. readfile(MP4_BBODYB,(BYTE *)&player_p[mcaps[MC_BBODYBL].cappts]) == NULL ||
  8074. readfile(MP4_BBODYC,(BYTE *)&player_p[mcaps[MC_BBODYCL].cappts]) == NULL ||
  8075. readfile(MP4_BHEADB,(BYTE *)&player_p[mcaps[MC_BHEADBL].cappts]) == NULL ||
  8076. readfile(MP4_BHEADC,(BYTE *)&player_p[mcaps[MC_BHEADCL].cappts]) == NULL ||
  8077. readfile(MP4_BJUMPB,(BYTE *)&player_p[mcaps[MC_BJUMPBL].cappts]) == NULL ||
  8078. readfile(MP4_CFOOTB,(BYTE *)&player_p[mcaps[MC_CFOOTBL].cappts]) == NULL ||
  8079. readfile(MP4_CFOOTC,(BYTE *)&player_p[mcaps[MC_CFOOTCL].cappts]) == NULL ||
  8080. readfile(MP4_CBODYB,(BYTE *)&player_p[mcaps[MC_CBODYBL].cappts]) == NULL ||
  8081. readfile(MP4_CBODYC,(BYTE *)&player_p[mcaps[MC_CBODYCL].cappts]) == NULL ||
  8082. readfile(MP4_CHEADB,(BYTE *)&player_p[mcaps[MC_CHEADBL].cappts]) == NULL ||
  8083. readfile(MP4_CJUMPB,(BYTE *)&player_p[mcaps[MC_CJUMPBL].cappts]) == NULL ||
  8084. readfile(MP4_SHOOT1,(BYTE *)&player_p[mcaps[MC_SHOOTR].cappts]) == NULL ||
  8085. readfile(MP4_CHIP1,(BYTE *)&player_p[mcaps[MC_CHIPR].cappts]) == NULL ||
  8086. readfile(MP4_SPASS1,(BYTE *)&player_p[mcaps[MC_PASSR].cappts]) == NULL ||
  8087. readfile(MP4_CROSS1,(BYTE *)&player_p[mcaps[MC_CROSSR].cappts]) == NULL ||
  8088. readfile(MP4_VOLLEY,(BYTE *)&player_p[mcaps[MC_VOLLEYR].cappts]) == NULL ||
  8089. // readfile(MP4_TOE2,(BYTE *)&player_p[mcaps[MC_TOER].cappts]) == NULL ||
  8090. readfile(MP4_DIAGPASS,(BYTE *)&player_p[mcaps[MC_DIAGPASSR].cappts]) == NULL ||
  8091. readfile(MP4_DIAGBACK,(BYTE *)&player_p[mcaps[MC_DIAGBACKR].cappts]) == NULL ||
  8092. readfile(MP4_SIDEPASS,(BYTE *)&player_p[mcaps[MC_SIDEPASSR].cappts]) == NULL ||
  8093. readfile(MP4_BACKHEEL,(BYTE *)&player_p[mcaps[MC_BACKHEELR].cappts]) == NULL ||
  8094. readfile(MP4_SVTOSTD,(BYTE *)&player_p[mcaps[MC_STOSL].cappts]) == NULL ||
  8095. readfile(MP4_SVTOSTB,(BYTE *)&player_p[mcaps[MC_STOSBL].cappts]) == NULL ||
  8096. readfile(MP4_TRAP,(BYTE *)&player_p[mcaps[MC_TRAPR].cappts]) == NULL ||
  8097. readfile(MP4_RIDE4,(BYTE *)&player_p[mcaps[MC_RIDEL].cappts]) == NULL ||
  8098. readfile(MP4_SOCKS2,(BYTE *)&player_p[mcaps[MC_SOCKSR].cappts]) == NULL ||
  8099. readfile(MP4_TROTB,(BYTE *)&player_p[mcaps[MC_TROTB].cappts]) == NULL ||
  8100. readfile(MP4_TROTG,(BYTE *)&player_p[mcaps[MC_TROTG].cappts]) == NULL ||
  8101. readfile(MP4_TROTD1,(BYTE *)&player_p[mcaps[MC_TROTD].cappts]) == NULL ||
  8102. readfile(MP4_TROTA,(BYTE *)&player_p[mcaps[MC_TROTA].cappts]) == NULL ||
  8103. readfile(MP4_TROTE,(BYTE *)&player_p[mcaps[MC_TROTE].cappts]) == NULL ||
  8104. readfile(MP4_RUN2,(BYTE *)&player_p[mcaps[MC_RUN].cappts]) == NULL ||
  8105. readfile(MP4_JOG1,(BYTE *)&player_p[mcaps[MC_JOG].cappts]) == NULL ||
  8106. readfile(MP4_BARGE,(BYTE *)&player_p[mcaps[MC_BARGE].cappts]) == NULL ||
  8107. readfile(MP4_THROWW,(BYTE *)&player_p[mcaps[MC_THROWW].cappts]) == NULL ||
  8108. // readfile(MP4_SHAMEW,(BYTE *)&player_p[mcaps[MC_SHAMEW].cappts]) == NULL ||
  8109. // readfile(MP4_LIE1,(BYTE *)&player_p[mcaps[MC_LIE].cappts]) == NULL ||
  8110. readfile(MP4_STAND1,(BYTE *)&player_p[mcaps[MC_STAND].cappts]) == NULL ||
  8111. readfile(MP4_SHEADER,(BYTE *)&player_p[mcaps[MC_S_HEAD].cappts]) == NULL ||
  8112. readfile(MP4_JHEADER,(BYTE *)&player_p[mcaps[MC_J_HEAD].cappts]) == NULL ||
  8113. readfile(MP4_HDOWN1,(BYTE *)&player_p[mcaps[MC_D_HEAD].cappts]) == NULL ||
  8114. // readfile(MP4_HEADUP,(BYTE *)&player_p[mcaps[MC_U_HEAD].cappts]) == NULL ||
  8115. readfile(MP4_DHEADER,(BYTE *)&player_p[mcaps[MC_DV_HEAD].cappts]) == NULL ||
  8116. readfile(MP4_CHEST1,(BYTE *)&player_p[mcaps[MC_CHEST].cappts]) == NULL ||
  8117. readfile(MP4_STACKLE,(BYTE *)&player_p[mcaps[MC_S_TACKLE].cappts]) == NULL ||
  8118. readfile(MP4_STEAL2,(BYTE *)&player_p[mcaps[MC_STEAL].cappts]) == NULL ||
  8119. readfile(MP4_OVERHEAD,(BYTE *)&player_p[mcaps[MC_OVERHEAD].cappts]) == NULL ||
  8120. readfile(MP4_THROWL,(BYTE *)&player_p[mcaps[MC_THROWL].cappts]) == NULL ||
  8121. readfile(MP4_THROWS,(BYTE *)&player_p[mcaps[MC_THROWS].cappts]) == NULL ||
  8122. readfile(MP4_FALLR,(BYTE *)&player_p[mcaps[MC_FALLR].cappts]) == NULL ||
  8123. // readfile(MP4_FALLS,(BYTE *)&player_p[mcaps[MC_FALLS].cappts]) == NULL ||
  8124. readfile(MP4_CELEB,(BYTE *)&player_p[mcaps[MC_CELEB].cappts]) == NULL ||
  8125. // readfile(MP4_SHAME1,(BYTE *)&player_p[mcaps[MC_SHAME].cappts]) == NULL ||
  8126. readfile(MP4_GETUP,(BYTE *)&player_p[mcaps[MC_GETUP].cappts]) == NULL ||
  8127. readfile(MP4_GETUPF,(BYTE *)&player_p[mcaps[MC_GETUPF].cappts]) == NULL ||
  8128. readfile(MP4_STANDB,(BYTE *)&player_p[mcaps[MC_STANDB].cappts]) == NULL ||
  8129. readfile(MP4_BOUNCE,(BYTE *)&player_p[mcaps[MC_BOUNCE].cappts]) == NULL ||
  8130. readfile(MP4_KICKOUT,(BYTE *)&player_p[mcaps[MC_KICKOUT].cappts]) == NULL ||
  8131. readfile(MP4_HALFVOLL,(BYTE *)&player_p[mcaps[MC_HALFVOLL].cappts]) == NULL ||
  8132. readfile(MP4_THROW,(BYTE *)&player_p[mcaps[MC_THROW].cappts]) == NULL ||
  8133. readfile(MP4_ROLL,(BYTE *)&player_p[mcaps[MC_ROLL].cappts]) == NULL ||
  8134. readfile(MP4_RUNWITHB,(BYTE *)&player_p[mcaps[MC_RUNWITHB].cappts]) == NULL ||
  8135. readfile(MP4_WAVEUP,(BYTE *)&player_p[mcaps[MC_WAVEUP].cappts]) == NULL ||
  8136. // readfile(MP4_PENALTY,(BYTE *)&player_p[mcaps[MC_PENALTY].cappts]) == NULL ||
  8137. // readfile(MP4_PLEAD,(BYTE *)&player_p[mcaps[MC_PLEAD].cappts]) == NULL ||
  8138. readfile(MP4_CRTOSTB1,(BYTE *)&player_p[mcaps[MC_CRTOSTB].cappts]) == NULL ||
  8139. readfile(MP4_PICKBALL,(BYTE *)&player_p[mcaps[MC_PICKBALL].cappts]) == NULL
  8140. )
  8141. goto init3d_error;
  8142. }
  8143. closedatafile();
  8144. // Making simple pitch
  8145. st_w=stadlist[setup.stadium].st_w;
  8146. st_l=stadlist[setup.stadium].st_l;
  8147. st_h=stadlist[setup.stadium].st_h;
  8148. for (i=0;i<19;i++)
  8149. {
  8150. pitch_p[1+i*3+2]=st_w;
  8151. pitch_p[1+(i+19)*3+2]=-800-st_w;
  8152. }
  8153. pitch_p[1]=-st_l;
  8154. pitch_p[1+19*3]=-st_l;
  8155. pitch_p[1+18*3]=1280+st_l;
  8156. pitch_p[1+37*3]=1280+st_l;
  8157. // Remapping textures
  8158. if (setup.verbose) {puts("Remapping textures...");fflush(stdout);}
  8159. tlptr=(dword *)&textures[0];
  8160. for (i=0;i<(NOTEXTURES+1)*8;i++) *tlptr++&=0xffffff00; // Correct unchecked carry in texture mapping (not a bug!)
  8161. tptr=maps[0]+128*256;
  8162. for (i=0;i<128*256;i++)
  8163. {
  8164. if (*tptr>=80 && *tptr<88) *tptr+=8;
  8165. tptr++;
  8166. }
  8167. tptr=maps[2];
  8168. for (i=0;i<65536;i++)
  8169. {
  8170. if (*tptr>=32 && *tptr<56) *tptr+=24;
  8171. if (*tptr>=80 && *tptr<88) *tptr+=8;
  8172. tptr++;
  8173. }
  8174. tptr=maps[3]+80*256;
  8175. for (i=0;i<80*256;i++)
  8176. {
  8177. if (*tptr>=32 && *tptr<56) *tptr+=24;
  8178. if (*tptr>=80 && *tptr<88) *tptr+=8;
  8179. tptr++;
  8180. }
  8181. tptr=maps[X_BM]+89*256;
  8182. for (i=0;i<27*256;i++)
  8183. {
  8184. if (*tptr>32 && *tptr<=56) *tptr+=24;
  8185. if (*tptr>80 && *tptr<=88) *tptr+=8;
  8186. tptr++;
  8187. }
  8188. tptr=maps[X_BM]+116*256+69;
  8189. for (i=0;i<27;i++)
  8190. {
  8191. for (j=0;j<92;j++)
  8192. {
  8193. if (*tptr>32 && *tptr<=56) *tptr+=24;
  8194. if (*tptr>80 && *tptr<=88) *tptr+=8;
  8195. tptr++;
  8196. }
  8197. tptr+=164;
  8198. }
  8199. if (setup.M8)
  8200. {
  8201. tptr=maps[S_BM+2];
  8202. for (i=0;i<65536;i++)
  8203. {
  8204. if (*tptr>=80 && *tptr<88) *tptr+=16;
  8205. tptr++;
  8206. }
  8207. tptr=maps[S_BM+3];
  8208. for (i=0;i<65536;i++)
  8209. {
  8210. if (*tptr>=32 && *tptr<56) *tptr+=24;
  8211. if (*tptr>=80 && *tptr<88) *tptr+=16;
  8212. tptr++;
  8213. }
  8214. tptr=maps[S_BM+4];
  8215. for (i=0;i<(78*256);i++)
  8216. {
  8217. if (*tptr>=80 && *tptr<88) *tptr+=16;
  8218. tptr++;
  8219. }
  8220. tptr=maps[S_BM+4]+80*256;
  8221. for (i=0;i<(78*256);i++)
  8222. {
  8223. if (*tptr>=32 && *tptr<56) *tptr+=24;
  8224. if (*tptr>=80 && *tptr<88) *tptr+=16;
  8225. tptr++;
  8226. }
  8227. tptr=maps[S_BM+5];
  8228. for (i=0;i<2*65536;i++)
  8229. {
  8230. if (*tptr>=80 && *tptr<88) *tptr+=8;
  8231. tptr++;
  8232. }
  8233. }
  8234. // Screen dump (640X400)
  8235. if (EUROmatch_info.tga_enable&&setup.M8)
  8236. {
  8237. if ((dumplbm=readrawfile("hires.tga",NULL)) == NULL) exit (1);
  8238. for (i=0;i<256;i++)
  8239. {
  8240. *(dumplbm+0x12+i*3)=pal[i*3+2]<<2;
  8241. *(dumplbm+0x12+i*3+1)=pal[i*3+1]<<2;
  8242. *(dumplbm+0x12+i*3+2)=pal[i*3]<<2;
  8243. }
  8244. }
  8245. // Prepare segment selectors for texture maps
  8246. if (setup.verbose) {puts("Preparing segment selectors...");fflush(stdout);}
  8247. // if ((selector=getselectors(mappages+stadlist[setup.stadium].noloop+2)) < 0)
  8248. if ((selector=getselectors(mappages+noloop+2)) < 0)
  8249. {
  8250. puts("Error preparing selectors");
  8251. goto init3d_error;
  8252. }
  8253. for (i=0;i<mappages;i++)
  8254. {
  8255. mapsel[i]=selector;
  8256. seg=maps[i];
  8257. if (setselector(selector,seg,65536) < 0)
  8258. {
  8259. puts("Error setting selectors");
  8260. goto init3d_error;
  8261. }
  8262. selector+=nextselectordisp(selector);
  8263. }
  8264. for (i=mappages;i<mappages+noloop;i++)
  8265. {
  8266. mapsel[i]=selector;
  8267. seg=maps[X_BM+(texloop[i-mappages].pos>>16)]+(texloop[i-mappages].pos&0xffff);
  8268. if (setselector(selector,seg,65536) < 0)
  8269. {
  8270. puts("Error setting selectors");
  8271. goto init3d_error;
  8272. }
  8273. selector+=nextselectordisp(selector);
  8274. }
  8275. /*
  8276. for (i=mappages;i<mappages+stadlist[setup.stadium].noloop;i++)
  8277. {
  8278. mapsel[i]=selector;
  8279. seg=maps[S_BM+(stadlist[setup.stadium].loop[i-mappages]>>16)]+(stadlist[setup.stadium].loop[i-mappages]&0xffff);
  8280. if (setselector(selector,seg,65536) < 0)
  8281. {
  8282. puts("Error setting selectors");
  8283. goto init3d_error;
  8284. }
  8285. selector+=nextselectordisp(selector);
  8286. }
  8287. */
  8288. mapsel[i]=selector;
  8289. seg=maps[X_BM]+148*256+64;
  8290. if (setselector(selector,seg,65536) < 0)
  8291. {
  8292. puts("Error setting selectors");
  8293. goto init3d_error;
  8294. }
  8295. selector+=nextselectordisp(selector);
  8296. mapsel[i+1]=selector;
  8297. seg=maps[X_BM]+116*256;
  8298. if (setselector(selector,seg,65536) < 0)
  8299. {
  8300. puts("Error setting selectors");
  8301. goto init3d_error;
  8302. }
  8303. // Free memory?
  8304. if (setup.verbose) {printf("Free memory = %d\n",get_mem_info());fflush(stdout);}
  8305. // Prepare filters
  8306. if (setup.verbose) {puts("Making colour filters...");fflush(stdout);}
  8307. makefilter(filters[0],0,0,0,0.5,0.5,0.5);
  8308. makefilter(filters[1],48,48,48,.5,.5,.5);
  8309. // Initialise objects
  8310. if (setup.verbose) {puts("Intialising data objects...");fflush(stdout);}
  8311. // Set players
  8312. for (i=0;i<11;i++)
  8313. initobj(&player[i],player_p[0],player_f1,0,0,0,1,0);
  8314. for (i=11;i<22;i++)
  8315. initobj(&player[i],player_p[0],player_f2,0,0,0,1,0);
  8316. initobj(&player[22],player_p[0],player_fr,0,0,0,1,0);
  8317. initobj(&player[23],player_p[0],player_fl,0,0,0,1,0);
  8318. initobj(&player[24],player_p[0],player_fl,0,0,0,1,0);
  8319. // Prepare player tweening
  8320. for (i=0;i<NPLAYERS;i++)
  8321. {
  8322. plyrtwtb[i].anim=MC_STAND;
  8323. plyrtwtb[i].tween=-1;
  8324. plyrtwtb[i].twnfrm=player[0].points;
  8325. *plyrtwtb[i].twnpts1=*plyrtwtb[i].twnpts2=PLYRPTS;
  8326. }
  8327. // Set player shadows/highlights
  8328. initobj(&plhilight[0][0],plshad_p,plshad_f,0,0,0,1,0);
  8329. initobj(&plhilight[1][0],plhi_p,plhi1_f1,0,0,0,1,0);
  8330. initobj(&plhilight[2][0],plhi_p,plhi2_f1,0,0,0,1,0);
  8331. initobj(&plhilight[3][0],plhi_p,plhi3_f1,0,0,0,1,0);
  8332. initobj(&plhilight[4][0],plhi_p,plhi3_f1,0,0,0,1,0);
  8333. initobj(&plhilight[5][0],plhi_p,plhi4_f1,0,0,0,1,0);
  8334. initobj(&plhilight[6][0],plhi_p,plhi4_f1,0,0,0,1,0);
  8335. initobj(&plhilight[0][1],plshad_p,plshad_f,0,0,0,1,0);
  8336. initobj(&plhilight[1][1],plhi_p,plhi1_f2,0,0,0,1,0);
  8337. initobj(&plhilight[2][1],plhi_p,plhi2_f2,0,0,0,1,0);
  8338. initobj(&plhilight[3][1],plhi_p,plhi3_f2,0,0,0,1,0);
  8339. initobj(&plhilight[4][1],plhi_p,plhi3_f2,0,0,0,1,0);
  8340. initobj(&plhilight[5][1],plhi_p,plhi4_f2,0,0,0,1,0);
  8341. initobj(&plhilight[6][1],plhi_p,plhi4_f2,0,0,0,1,0);
  8342. initobj(&plhilight[0][2],plshad_p,plshad_f,0,0,0,1,0);
  8343. initobj(&plhilight[1][2],plhi_p,plhi1_f3,0,0,0,1,0);
  8344. initobj(&plhilight[2][2],plhi_p,plhi2_f3,0,0,0,1,0);
  8345. initobj(&plhilight[3][2],plhi_p,plhi3_f3,0,0,0,1,0);
  8346. initobj(&plhilight[4][2],plhi_p,plhi3_f3,0,0,0,1,0);
  8347. initobj(&plhilight[5][2],plhi_p,plhi4_f3,0,0,0,1,0);
  8348. initobj(&plhilight[6][2],plhi_p,plhi4_f3,0,0,0,1,0);
  8349. initobj(&plhilight[0][3],plshad_p,plshad_f,0,0,0,1,0);
  8350. initobj(&plhilight[1][3],plhi_p,plhi1_f4,0,0,0,1,0);
  8351. initobj(&plhilight[2][3],plhi_p,plhi2_f4,0,0,0,1,0);
  8352. initobj(&plhilight[3][3],plhi_p,plhi3_f4,0,0,0,1,0);
  8353. initobj(&plhilight[4][3],plhi_p,plhi3_f4,0,0,0,1,0);
  8354. initobj(&plhilight[5][3],plhi_p,plhi4_f4,0,0,0,1,0);
  8355. initobj(&plhilight[6][3],plhi_p,plhi4_f4,0,0,0,1,0);
  8356. initobj(&plhilight[0][4],plshad_p,plshad_f,0,0,0,1,0);
  8357. initobj(&plhilight[1][4],plhi_p,plhi1_f5,0,0,0,1,0);
  8358. initobj(&plhilight[2][4],plhi_p,plhi2_f5,0,0,0,1,0);
  8359. initobj(&plhilight[3][4],plhi_p,plhi3_f5,0,0,0,1,0);
  8360. initobj(&plhilight[4][4],plhi_p,plhi3_f5,0,0,0,1,0);
  8361. initobj(&plhilight[5][4],plhi_p,plhi4_f5,0,0,0,1,0);
  8362. initobj(&plhilight[6][4],plhi_p,plhi4_f5,0,0,0,1,0);
  8363. initobj(&plhilight[0][5],plshad_p,plshad_f,0,0,0,1,0);
  8364. initobj(&plhilight[1][5],plhi_p,plhi1_ff,0,0,0,1,0);
  8365. initobj(&plhilight[2][5],plhi_p,plhi2_ff,0,0,0,1,0);
  8366. initobj(&plhilight[3][5],plhi_p,plhi3_ff,0,0,0,1,0);
  8367. initobj(&plhilight[4][5],plhi_p,plhi3_ff,0,0,0,1,0);
  8368. initobj(&plhilight[5][5],plhi_p,plhi4_ff,0,0,0,1,0);
  8369. initobj(&plhilight[6][5],plhi_p,plhi4_ff,0,0,0,1,0);
  8370. // Set ball
  8371. initobj(&ball,footy_p,footy_f,640,0,-400,1,0);
  8372. // Set ball shadow
  8373. initobj(&ballshad,ballshad_p,ballshad_f,640,0,-400,1,0);
  8374. // Set simple pitch
  8375. initobj(&pitch,pitch_p,pitch_f,0,0,0,1,0);
  8376. // Set pitch lines
  8377. initobj(&l1,l1_p1,l_f1a,210,0,-200,1,0);
  8378. initobj(&l2,l2_p1,l_f1a,1070,0,-200,1,0);
  8379. initobj(&l3,l3_p1,l_f1a,1070,0,-600,1,0);
  8380. initobj(&l4,l4_p1,l_f1a,210,0,-600,1,0);
  8381. initobj(&l5,l5_p1,l_f3a,640,0,-200,1,0);
  8382. initobj(&l6,l6_p1,l_f3a,640,0,-600,1,0);
  8383. initobj(&circle,circle_pa,circle_fa,640,0,-400,1,0);
  8384. initobj(&semi1,s_circle_p1a,s_circle_f1a,123,0,-400,1,0);
  8385. initobj(&semi2,s_circle_p2a,s_circle_f2a,1157,0,-400,1,0);
  8386. initobj(&spot1,spot_p,spot_f,640,0,-400,1,0);
  8387. initobj(&spot2,spot_p,spot_f,128,0,-400,1,0);
  8388. initobj(&spot3,spot_p,spot_f,1152,0,-400,1,0);
  8389. // Set goals
  8390. initobj(&goal1_1,goal1a_p,goal_f1a,0,0,-443.5,1,0);
  8391. initobj(&goal2_1,goal1a_p,goal_f1a,0,0,-356.5,1,0);
  8392. initobj(&goal3_1,goal1a_p,goal_f1a,0,37,-400,1,0);
  8393. initobj(&goal4_1,goal1a_p,goal_f1a,-28,0,-400,1,0);
  8394. initobj(&goal1_2,goal1a_p,goal_f1a,1280,0,-443.5,1,0);
  8395. initobj(&goal2_2,goal1a_p,goal_f1a,1280,0,-356.5,1,0);
  8396. initobj(&goal3_2,goal1a_p,goal_f1a,1280,37,-400,1,0);
  8397. initobj(&goal4_2,goal1a_p,goal_f1a,1308,0,-400,1,0);
  8398. // Set flags
  8399. initobj(&flag_1,flag_p,flag_f,0,0,0,1,0);
  8400. initobj(&flag_2,flag_p,flag_f,1280,0,0,1,0);
  8401. initobj(&flag_3,flag_p,flag_f,0,0,-800,1,0);
  8402. initobj(&flag_4,flag_p,flag_f,1280,0,-800,1,0);
  8403. // Set stands
  8404. initobj(&stad1,stad1_p,stad1_f, stadlist[setup.stadium].s1x,stadlist[setup.stadium].s1y,stadlist[setup.stadium].s1z,1,0);
  8405. initobj(&stad2,stad2_p,stad2_f, stadlist[setup.stadium].s2x,stadlist[setup.stadium].s2y,stadlist[setup.stadium].s2z,1,0);
  8406. initobj(&stad3,stad3_p,stad3_f, stadlist[setup.stadium].s3x,stadlist[setup.stadium].s3y,stadlist[setup.stadium].s3z,1,0);
  8407. initobj(&stad4,stad4_p,stad4_f, stadlist[setup.stadium].s4x,stadlist[setup.stadium].s4y,stadlist[setup.stadium].s4z,1,0);
  8408. stp=stad1_f;
  8409. i=*stp++;
  8410. for(;i;i--)
  8411. {
  8412. j=*stp++;
  8413. if (*stp<0) *stp-=S_TM-1;
  8414. stp++;
  8415. for (;j;j--) stp++;
  8416. }
  8417. stp=stad2_f;
  8418. i=*stp++;
  8419. for(;i;i--)
  8420. {
  8421. j=*stp++;
  8422. if (*stp<0) *stp-=S_TM-1;
  8423. stp++;
  8424. for (;j;j--) stp++;
  8425. }
  8426. stp=stad3_f;
  8427. i=*stp++;
  8428. for(;i;i--)
  8429. {
  8430. j=*stp++;
  8431. if (*stp<0) *stp-=S_TM-1;
  8432. stp++;
  8433. for (;j;j--) stp++;
  8434. }
  8435. stp=stad4_f;
  8436. i=*stp++;
  8437. for(;i;i--)
  8438. {
  8439. j=*stp++;
  8440. if (*stp<0) *stp-=S_TM-1;
  8441. stp++;
  8442. for (;j;j--) stp++;
  8443. }
  8444. // Initialise animations
  8445. buff_ptr=(char *)(maps[S_BM])+stadlist[setup.stadium].vmap;
  8446. vidi_anim=0;
  8447. vidi_in=0;
  8448. if (readrawfile(fapoffs,(BYTE *)load_offsets) == NULL) goto init3d_error;
  8449. if (opendatafile(fapfile) < 0) goto init3d_error;
  8450. if (setup.M8)
  8451. {
  8452. #ifdef JAPAN
  8453. readfile(FAP_VIJAP,(BYTE *)anim_data);
  8454. #else
  8455. #ifdef AMERICA
  8456. readfile(FAP_VR,(BYTE *)anim_data);
  8457. #else
  8458. readfile(FAP_VIDI,(BYTE *)anim_data);
  8459. #endif
  8460. #endif
  8461. init_anim(vidi,0);
  8462. }
  8463. #ifdef AMERICA
  8464. readfile(COL_VR,(BYTE *)&pal[240*3]);
  8465. #endif
  8466. // Prepare miscellaneous data
  8467. if (setup.verbose) {puts("Preparing miscellaneous data...");fflush(stdout);}
  8468. // Set screen mode and set buffer info
  8469. if (setup.verbose) {puts("Geting VESA information...");fflush(stdout);}
  8470. // MCGA_buff.buff_start=(BYTE *)0xa0000;
  8471. for (i=0;i<SCRSIZES;i++)
  8472. {
  8473. MCGA_buff[i].buff_start=scrb+320+((320-MCGA_buff[i].clip_wid)>>1)+((200-MCGA_buff[i].clip_hgt)>>1)*320;
  8474. for (j=0;j<VESAMODES;j++)
  8475. VESA_buff[j][i].buff_start=scrb+640+((VESA_buff[j][i].buff_wid-VESA_buff[j][i].clip_wid)>>1)+((VESA_buff[j][i].buff_hgt-VESA_buff[j][i].clip_hgt)>>1)*VESA_buff[j][i].buff_wid;
  8476. }
  8477. for (i=0;i<MODES_3DB;i++)
  8478. buff_3DB[i].buff_start=scrb;
  8479. if (setup.stadium>=90)
  8480. {
  8481. vidi_buff_1.buff_start=maps[S_BM]+7*256+10;
  8482. vidi_buff_2.buff_start=maps[S_BM]+7*256+10;
  8483. }
  8484. else
  8485. {
  8486. vidi_buff_1.buff_start=maps[S_BM]+14*256+51;
  8487. vidi_buff_2.buff_start=maps[S_BM]+14*256+51;
  8488. }
  8489. if (setup.vidi_type==0)
  8490. vidi_buff=vidi_buff_1;
  8491. else
  8492. vidi_buff=vidi_buff_2;
  8493. for (i=0;i<NO_MENUS;i++)
  8494. {
  8495. menu_buff_l[i].scale_x=(MCGA_buff[0].clip_wid-menu_buff_l[i].clip_wid)>>1;
  8496. menu_buff_l[i].scale_y=MCGA_buff[0].clip_hgt-menu_buff_l[i].buff_hgt;
  8497. menu_buff_l[i].buff_start=MCGA_buff[0].buff_start+(int)menu_buff_l[i].scale_y*MCGA_buff[0].buff_wid+(int)menu_buff_l[i].scale_x;
  8498. menu_buff_h[i].scale_x=(VESA_buff[0][0].clip_wid-menu_buff_h[i].clip_wid)>>1;
  8499. menu_buff_h[i].scale_y=VESA_buff[0][0].clip_hgt-menu_buff_h[i].buff_hgt;
  8500. menu_buff_h[i].buff_start=VESA_buff[0][0].buff_start+(int)menu_buff_h[i].scale_y*VESA_buff[0][0].buff_wid+(int)menu_buff_h[i].scale_x;
  8501. }
  8502. return (0);
  8503. init3d_error:;
  8504. end3d();
  8505. return (-1);
  8506. }
  8507. void
  8508. setscreen()
  8509. {
  8510. int i,j,k,pf;
  8511. int taddr,taddr1;
  8512. #ifdef BLASTER
  8513. if ((scrmode3DB=Init3DB(modelist3DB))<0)
  8514. #else
  8515. if (1)
  8516. #endif
  8517. {
  8518. init3DB_error:;
  8519. scrmode3DB=-1;
  8520. remapgfx(1);
  8521. if (setup.start_res==0)
  8522. {
  8523. scrmode=0x13;
  8524. VGAmode(scrmode);
  8525. main_buff=MCGA_buff[setup.screen_size];
  8526. }
  8527. else
  8528. {
  8529. testVESA=0;
  8530. scrmode=VESAmode(&modelist[0]);
  8531. switch(scrmode)
  8532. {
  8533. case 0x100:main_buff=VESA_buff[0][setup.screen_size];break;
  8534. case 0x101:main_buff=VESA_buff[1][setup.screen_size];break;
  8535. default:VGAmode(0x13);main_buff=MCGA_buff[setup.screen_size];scrmode=0x13;
  8536. }
  8537. }
  8538. setup.start_res=(scrmode==0x13)?0:1;
  8539. // Set palette
  8540. setpal();
  8541. // Clear screen
  8542. switch(scrmode)
  8543. {
  8544. case 0x13:
  8545. vclear(scrb+320,320,200,320,5);
  8546. mcgacpy(scrb+320,0,0,320,200,320);
  8547. break;
  8548. case 0x100:
  8549. vclear(scrb+640,640,400,640,5);
  8550. svgacpy(scrb+640,0,0,640,400,640);
  8551. break;
  8552. case 0x101:
  8553. vclear(scrb+640,640,480,640,5);
  8554. svgacpy(scrb+640,0,0,640,480,640);
  8555. break;
  8556. }
  8557. }
  8558. #ifdef BLASTER
  8559. else
  8560. {
  8561. if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto init3DB_error;
  8562. if (opendatafile(datafile) < 0 ) goto init3DB_error;
  8563. switch(stadlist[setup.stadium].pitchfile)
  8564. {
  8565. case BM_PA: pf=BM_PT1;break;
  8566. case BM_PB: pf=BM_PT2;break;
  8567. case BM_PC: pf=BM_PT3;break;
  8568. case BM_PD: pf=BM_PT4;break;
  8569. }
  8570. if (
  8571. readfile(skylist[skyno].skypfile3DB,&pal[3*208]) == NULL ||
  8572. readfile(skylist[skyno].skyfile3DB,sky) == NULL ||
  8573. readfile(pf,pitch3DB) == NULL
  8574. )
  8575. goto init3DB_error;
  8576. closedatafile();
  8577. #ifdef BLASTDEMO
  8578. scrmode=(setup.start_res=(scrmode3DB>1)?1:0)?0x100:0x13;
  8579. #else
  8580. scrmode=(setup.start_res=(scrmode3DB>0)?1:0)?0x100:0x13;
  8581. #endif
  8582. main_buff=buff_3DB[scrmode3DB];
  8583. pal[3]=pal[4]=pal[5]=63;
  8584. pal[191*3]=pal[191*3+1]=pal[191*3+2]=0;
  8585. SetPalette3DB(pal);
  8586. // Load 3D Blaster textures
  8587. remapxgfx(-1);
  8588. for (i=0;i<mappages;i+=4)
  8589. {
  8590. #ifdef RENDITION
  8591. MapAddress3DB=i*64;
  8592. #else
  8593. MapAddress3DB=-i*64;
  8594. #endif
  8595. for (j=0;j<4&&(i+j)!=mappages;j++)
  8596. {
  8597. taddr=MapAddress3DB;
  8598. if ((texaddr3DB[i+j]=LoadTexture3DB((char *)maps[i+j],1024,256,256))<0)
  8599. goto init3DB_error;
  8600. MapAddress3DB=taddr+1024*256;
  8601. }
  8602. }
  8603. // MapAddress3DB=1024*1024;
  8604. if ((skyaddr3DB=LoadTexture3DB((char *)sky,512,512,128))<0)
  8605. goto init3DB_error;
  8606. MapAddress3DB=1024*1024+128*512;
  8607. if ((pitchaddr3DB=LoadTexture3DB((char *)pitch3DB,64,64,64))<0)
  8608. goto init3DB_error;
  8609. }
  8610. #endif
  8611. }
  8612. void end3d()
  8613. {
  8614. int i;
  8615. closedatafile();
  8616. for (i=0;i<mappages+noloop+2;i++)
  8617. {
  8618. if (mapsel[i]!=-1)
  8619. if (freeselector(mapsel[i]) < 0)
  8620. {
  8621. puts("Error freeing selectors");
  8622. // exit(1);
  8623. }
  8624. }
  8625. if (EUROmatch_info.tga_enable&&setup.M8) freex(dumplbm);
  8626. if (setup.M8) freex(anim_data);
  8627. freex(rotlist);
  8628. freex(ptslist);
  8629. freex(pollist);
  8630. freex(objlist);
  8631. freex(plyrtwtb);
  8632. freex(player_p);
  8633. freex(filters);
  8634. freex(textures);
  8635. if (setup.M8) freex(sky);
  8636. freex(scrb);
  8637. freex(maps);
  8638. if (scrmode3DB>=0)
  8639. Close3DB();
  8640. }
  8641. /****************/
  8642. /* TIME MACHINE */
  8643. void __far timetest(void) {performance++;};
  8644. /*
  8645. int timing()
  8646. {
  8647. float t;
  8648. int c=0;
  8649. performance=0;
  8650. sosTIMERInitSystem(_TIMER_DOS_RATE,_SOS_DEBUG_NORMAL);
  8651. sosTIMERRegisterEvent(100,timetest,&TimerHandle);
  8652. for (i=0;i<100000;i++)
  8653. {
  8654. t=sin(c++);
  8655. *(char *)0xa0000=(char)t;
  8656. }
  8657. sosTIMERRemoveEvent(TimerHandle);
  8658. sosTIMERUnInitSystem(0);
  8659. performance=2000/performance;
  8660. }
  8661. */
  8662. int timing()
  8663. {
  8664. int i,j;
  8665. word selector;
  8666. BYTE *seg;
  8667. word *stp;
  8668. plyrdat *plyrwr,plyr[NPLAYERS+2];
  8669. unsigned int TimerHandle;
  8670. datapt dp[1]={0};
  8671. timeit=1;
  8672. setup.M8=0;
  8673. setup.team_a=0;
  8674. setup.team_b=setup.team_b_kit=1;
  8675. setup.stadium=45;
  8676. setup.vidi_type=0;
  8677. setup.start_res=0;
  8678. setup.screen_size=0;
  8679. setup.detail.stadia=1;
  8680. setup.detail.pitch=1;
  8681. setup.detail.lines=1;
  8682. setup.detail.sky=1;
  8683. setup.detail.players=1;
  8684. setup.detail.shadows=1;
  8685. if (
  8686. (maps=(mappage *)mallocx((mappages=MAPPAGES_4)*65536)) == NULL ||
  8687. (scrb=(BYTE *)mallocx(320*202)) == NULL ||
  8688. (textures=(texture *)mallocx((NOTEXTURES+CLIP_TEXTURES+1)*sizeof(texture))) == NULL ||
  8689. (filters=(filter *)mallocx(FILTERS*sizeof(filter))) == NULL ||
  8690. (player_p=(capfrm *)mallocx(100*sizeof(capfrm))) == NULL ||
  8691. (plyrtwtb=(plyrtwdat *)mallocx(NPLAYERS*sizeof(plyrtwdat))) == NULL ||
  8692. (objlist=(objs *)mallocx(MAXOBJ*sizeof(objs))) == NULL ||
  8693. (pollist=(pols *)mallocx(MAXPOL*sizeof(pols))) == NULL ||
  8694. (ptslist=(scrpt *)mallocx(MAXPOL*10*sizeof(scrpt))) == NULL ||
  8695. (rotlist=(rotpt *)mallocx(MAXPTS*4*sizeof(rotpt))) == NULL )
  8696. {
  8697. puts("Error reserving memory");
  8698. exit(-1);
  8699. }
  8700. mcaps=mcaps4;
  8701. if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) exit(1);
  8702. if (opendatafile(datafile)<0) return(-1);
  8703. if (readfile(TMD_TEXDATA,(BYTE *)&textures[1]) == NULL) exit(1);
  8704. if (
  8705. readfile(stadlist[setup.stadium].tmdfile,(BYTE *)&textures[S_TM]) == NULL ||
  8706. readfile(stadlist[setup.stadium].s1pfile,(BYTE *)&stad1_p) == NULL ||
  8707. readfile(stadlist[setup.stadium].s1ffile,(BYTE *)&stad1_f) == NULL ||
  8708. readfile(stadlist[setup.stadium].s2pfile,(BYTE *)&stad2_p) == NULL ||
  8709. readfile(stadlist[setup.stadium].s2ffile,(BYTE *)&stad2_f) == NULL ||
  8710. readfile(stadlist[setup.stadium].s3pfile,(BYTE *)&stad3_p) == NULL ||
  8711. readfile(stadlist[setup.stadium].s3ffile,(BYTE *)&stad3_f) == NULL ||
  8712. readfile(stadlist[setup.stadium].s4pfile,(BYTE *)&stad4_p) == NULL ||
  8713. readfile(stadlist[setup.stadium].s4ffile,(BYTE *)&stad4_f) == NULL
  8714. )
  8715. exit(1);
  8716. if (readfile(MP4_STAND1,(BYTE *)&player_p[0]) == NULL) exit(1);
  8717. closedatafile();
  8718. // Prepare segment selectors for texture maps
  8719. if ((selector=getselectors(mappages+noloop+2)) < 0)
  8720. {
  8721. puts("Error preparing selectors");
  8722. exit(2);
  8723. }
  8724. for (i=0;i<mappages;i++)
  8725. {
  8726. mapsel[i]=selector;
  8727. seg=maps[i];
  8728. if (setselector(selector,seg,65536) < 0)
  8729. {
  8730. puts("Error setting selectors");
  8731. exit(3);
  8732. }
  8733. selector+=nextselectordisp(selector);
  8734. }
  8735. for (i=mappages;i<mappages+noloop;i++)
  8736. {
  8737. mapsel[i]=selector;
  8738. seg=maps[X_BM+(texloop[i-mappages].pos>>16)]+(texloop[i-mappages].pos&0xffff);
  8739. if (setselector(selector,seg,65536) < 0)
  8740. {
  8741. puts("Error setting selectors");
  8742. exit(3);
  8743. }
  8744. selector+=nextselectordisp(selector);
  8745. }
  8746. mapsel[i]=selector;
  8747. seg=maps[X_BM]+148*256+64;
  8748. if (setselector(selector,seg,65536) < 0)
  8749. {
  8750. puts("Error setting selectors");
  8751. exit(3);
  8752. }
  8753. selector+=nextselectordisp(selector);
  8754. mapsel[i+1]=selector;
  8755. seg=maps[X_BM]+116*256;
  8756. if (setselector(selector,seg,65536) < 0)
  8757. {
  8758. puts("Error setting selectors");
  8759. exit(3);
  8760. }
  8761. // Prepare filters
  8762. makefilter(filters[0],0,0,0,0.5,0.5,0.5);
  8763. makefilter(filters[1],48,48,48,.5,.5,.5);
  8764. // Initialise objects
  8765. // Set players
  8766. for (i=0;i<11;i++)
  8767. initobj(&player[i],player_p[0],player_f1,0,0,0,1,0);
  8768. for (i=11;i<22;i++)
  8769. initobj(&player[i],player_p[0],player_f2,0,0,0,1,0);
  8770. initobj(&player[22],player_p[0],player_fr,0,0,0,1,0);
  8771. initobj(&player[23],player_p[0],player_fl,0,0,0,1,0);
  8772. initobj(&player[24],player_p[0],player_fl,0,0,0,1,0);
  8773. // Prepare player tweening
  8774. for (i=0;i<NPLAYERS;i++)
  8775. {
  8776. plyrtwtb[i].anim=0;
  8777. plyrtwtb[i].tween=-1;
  8778. plyrtwtb[i].twnfrm=player[0].points;
  8779. *plyrtwtb[i].twnpts1=*plyrtwtb[i].twnpts2=PLYRPTS;
  8780. }
  8781. // Set player shadows/highlights
  8782. initobj(&plhilight[0][0],plshad_p,plshad_f,0,0,0,1,0);
  8783. initobj(&plhilight[1][0],plhi_p,plhi1_f1,0,0,0,1,0);
  8784. initobj(&plhilight[2][0],plhi_p,plhi2_f1,0,0,0,1,0);
  8785. initobj(&plhilight[3][0],plhi_p,plhi3_f1,0,0,0,1,0);
  8786. initobj(&plhilight[4][0],plhi_p,plhi3_f1,0,0,0,1,0);
  8787. initobj(&plhilight[5][0],plhi_p,plhi4_f1,0,0,0,1,0);
  8788. initobj(&plhilight[0][1],plshad_p,plshad_f,0,0,0,1,0);
  8789. initobj(&plhilight[1][1],plhi_p,plhi1_f2,0,0,0,1,0);
  8790. initobj(&plhilight[2][1],plhi_p,plhi2_f2,0,0,0,1,0);
  8791. initobj(&plhilight[3][1],plhi_p,plhi3_f2,0,0,0,1,0);
  8792. initobj(&plhilight[4][1],plhi_p,plhi3_f2,0,0,0,1,0);
  8793. initobj(&plhilight[5][1],plhi_p,plhi4_f2,0,0,0,1,0);
  8794. initobj(&plhilight[0][2],plshad_p,plshad_f,0,0,0,1,0);
  8795. initobj(&plhilight[1][2],plhi_p,plhi1_f3,0,0,0,1,0);
  8796. initobj(&plhilight[2][2],plhi_p,plhi2_f3,0,0,0,1,0);
  8797. initobj(&plhilight[3][2],plhi_p,plhi3_f3,0,0,0,1,0);
  8798. initobj(&plhilight[4][2],plhi_p,plhi3_f3,0,0,0,1,0);
  8799. initobj(&plhilight[5][2],plhi_p,plhi4_f3,0,0,0,1,0);
  8800. initobj(&plhilight[0][3],plshad_p,plshad_f,0,0,0,1,0);
  8801. initobj(&plhilight[1][3],plhi_p,plhi1_f4,0,0,0,1,0);
  8802. initobj(&plhilight[2][3],plhi_p,plhi2_f4,0,0,0,1,0);
  8803. initobj(&plhilight[3][3],plhi_p,plhi3_f4,0,0,0,1,0);
  8804. initobj(&plhilight[4][3],plhi_p,plhi3_f4,0,0,0,1,0);
  8805. initobj(&plhilight[5][3],plhi_p,plhi4_f4,0,0,0,1,0);
  8806. initobj(&plhilight[0][4],plshad_p,plshad_f,0,0,0,1,0);
  8807. initobj(&plhilight[1][4],plhi_p,plhi1_f5,0,0,0,1,0);
  8808. initobj(&plhilight[2][4],plhi_p,plhi2_f5,0,0,0,1,0);
  8809. initobj(&plhilight[3][4],plhi_p,plhi3_f5,0,0,0,1,0);
  8810. initobj(&plhilight[4][4],plhi_p,plhi3_f5,0,0,0,1,0);
  8811. initobj(&plhilight[5][4],plhi_p,plhi4_f5,0,0,0,1,0);
  8812. initobj(&plhilight[0][5],plshad_p,plshad_f,0,0,0,1,0);
  8813. initobj(&plhilight[1][5],plhi_p,plhi1_ff,0,0,0,1,0);
  8814. initobj(&plhilight[2][5],plhi_p,plhi2_ff,0,0,0,1,0);
  8815. initobj(&plhilight[3][5],plhi_p,plhi3_ff,0,0,0,1,0);
  8816. initobj(&plhilight[4][5],plhi_p,plhi3_ff,0,0,0,1,0);
  8817. initobj(&plhilight[5][5],plhi_p,plhi4_ff,0,0,0,1,0);
  8818. // Set ball
  8819. initobj(&ball,footy_p,footy_f,640,0,-400,1,0);
  8820. // Set ball shadow
  8821. initobj(&ballshad,ballshad_p,ballshad_f,640,0,-400,1,0);
  8822. // Set pitch lines
  8823. initobj(&l1,l1_p1,l_f1a,210,0,-200,1,0);
  8824. initobj(&l2,l2_p1,l_f1a,1070,0,-200,1,0);
  8825. initobj(&l3,l3_p1,l_f1a,1070,0,-600,1,0);
  8826. initobj(&l4,l4_p1,l_f1a,210,0,-600,1,0);
  8827. initobj(&l5,l5_p1,l_f3a,640,0,-200,1,0);
  8828. initobj(&l6,l6_p1,l_f3a,640,0,-600,1,0);
  8829. initobj(&circle,circle_pa,circle_fa,640,0,-400,1,0);
  8830. initobj(&semi1,s_circle_p1a,s_circle_f1a,123,0,-400,1,0);
  8831. initobj(&semi2,s_circle_p2a,s_circle_f2a,1157,0,-400,1,0);
  8832. initobj(&spot1,spot_p,spot_f,640,0,-400,1,0);
  8833. initobj(&spot2,spot_p,spot_f,128,0,-400,1,0);
  8834. initobj(&spot3,spot_p,spot_f,1152,0,-400,1,0);
  8835. // Set goals
  8836. initobj(&goal1_1,goal1a_p,goal_f1a,0,0,-443.5,1,0);
  8837. initobj(&goal2_1,goal1a_p,goal_f1a,0,0,-356.5,1,0);
  8838. initobj(&goal3_1,goal1a_p,goal_f1a,0,37,-400,1,0);
  8839. initobj(&goal4_1,goal1a_p,goal_f1a,-28,0,-400,1,0);
  8840. initobj(&goal1_2,goal1a_p,goal_f1a,1280,0,-443.5,1,0);
  8841. initobj(&goal2_2,goal1a_p,goal_f1a,1280,0,-356.5,1,0);
  8842. initobj(&goal3_2,goal1a_p,goal_f1a,1280,37,-400,1,0);
  8843. initobj(&goal4_2,goal1a_p,goal_f1a,1308,0,-400,1,0);
  8844. // Set flags
  8845. initobj(&flag_1,flag_p,flag_f,0,0,0,1,0);
  8846. initobj(&flag_2,flag_p,flag_f,1280,0,0,1,0);
  8847. initobj(&flag_3,flag_p,flag_f,0,0,-800,1,0);
  8848. initobj(&flag_4,flag_p,flag_f,1280,0,-800,1,0);
  8849. // Set stands
  8850. initobj(&stad1,stad1_p,stad1_f, stadlist[setup.stadium].s1x,stadlist[setup.stadium].s1y,stadlist[setup.stadium].s1z,1,0);
  8851. initobj(&stad2,stad2_p,stad2_f, stadlist[setup.stadium].s2x,stadlist[setup.stadium].s2y,stadlist[setup.stadium].s2z,1,0);
  8852. initobj(&stad3,stad3_p,stad3_f, stadlist[setup.stadium].s3x,stadlist[setup.stadium].s3y,stadlist[setup.stadium].s3z,1,0);
  8853. initobj(&stad4,stad4_p,stad4_f, stadlist[setup.stadium].s4x,stadlist[setup.stadium].s4y,stadlist[setup.stadium].s4z,1,0);
  8854. stp=stad1_f;
  8855. i=*stp++;
  8856. for(;i;i--)
  8857. {
  8858. j=*stp++;
  8859. if (*stp<0) *stp-=S_TM-1;
  8860. stp++;
  8861. for (;j;j--) stp++;
  8862. }
  8863. stp=stad2_f;
  8864. i=*stp++;
  8865. for(;i;i--)
  8866. {
  8867. j=*stp++;
  8868. if (*stp<0) *stp-=S_TM-1;
  8869. stp++;
  8870. for (;j;j--) stp++;
  8871. }
  8872. stp=stad3_f;
  8873. i=*stp++;
  8874. for(;i;i--)
  8875. {
  8876. j=*stp++;
  8877. if (*stp<0) *stp-=S_TM-1;
  8878. stp++;
  8879. for (;j;j--) stp++;
  8880. }
  8881. stp=stad4_f;
  8882. i=*stp++;
  8883. for(;i;i--)
  8884. {
  8885. j=*stp++;
  8886. if (*stp<0) *stp-=S_TM-1;
  8887. stp++;
  8888. for (;j;j--) stp++;
  8889. }
  8890. MCGA_buff[0].buff_start=scrb+320+((320-MCGA_buff[0].clip_wid)>>1)+((200-MCGA_buff[0].clip_hgt)>>1)*320;
  8891. scrmode=0x13;
  8892. scrmode3DB=-1;
  8893. VGAmode(scrmode);
  8894. main_buff=MCGA_buff[0];
  8895. for (i=0;i<768;i++) pal[i]=0;
  8896. setpal();
  8897. plyrwr=plyr;
  8898. for (i=0;i<11;i++)
  8899. {
  8900. plyrwr->x=640;
  8901. plyrwr->y=0;
  8902. plyrwr->z=400;
  8903. plyrwr->type=1;
  8904. plyrwr->number=i+1;
  8905. plyrwr->htype=plyrwr->hcol=0;
  8906. plyrwr->crot=1;
  8907. plyrwr->srot=0;
  8908. plyrwr->anim=0;
  8909. plyrwr->frame=0;
  8910. plyrwr->fstep=0.5;
  8911. plyrwr->sprite=-1;
  8912. plyrwr++;
  8913. }
  8914. for (i=0;i<11;i++)
  8915. {
  8916. plyrwr->x=640;
  8917. plyrwr->y=0;
  8918. plyrwr->z=400;
  8919. plyrwr->type=2;
  8920. plyrwr->number=i+1;
  8921. plyrwr->htype=plyrwr->hcol=0;
  8922. plyrwr->crot=1;
  8923. plyrwr->srot=0;
  8924. plyrwr->anim=0;
  8925. plyrwr->frame=0;
  8926. plyrwr->fstep=0.5;
  8927. plyrwr->sprite=-1;
  8928. plyrwr++;
  8929. }
  8930. plyrwr->x=640;
  8931. plyrwr->y=0;
  8932. plyrwr->z=400;
  8933. plyrwr->type=3;
  8934. plyrwr->number=i+1;
  8935. plyrwr->htype=plyrwr->hcol=0;
  8936. plyrwr->crot=1;
  8937. plyrwr->srot=0;
  8938. plyrwr->anim=0;
  8939. plyrwr->frame=0;
  8940. plyrwr->fstep=0.5;
  8941. plyrwr->sprite=-1;
  8942. plyrwr++;
  8943. for (i=0;i<2;i++)
  8944. {
  8945. plyrwr->x=640;
  8946. plyrwr->y=0;
  8947. plyrwr->z=400;
  8948. plyrwr->type=4;
  8949. plyrwr->number=i+1;
  8950. plyrwr->htype=plyrwr->hcol=0;
  8951. plyrwr->crot=1;
  8952. plyrwr->srot=0;
  8953. plyrwr->anim=0;
  8954. plyrwr->frame=0;
  8955. plyrwr->fstep=0.5;
  8956. plyrwr->sprite=-1;
  8957. plyrwr++;
  8958. }
  8959. plyrwr->x=640;
  8960. plyrwr->y=20;
  8961. plyrwr->z=400;
  8962. plyrwr->crot=1;
  8963. plyrwr->srot=0;
  8964. plyrwr->frame=1;
  8965. plyrwr->fstep=0;
  8966. plyrwr->sprite=-1;
  8967. plyrwr++;
  8968. performance=0;
  8969. sosTIMERInitSystem(_TIMER_DOS_RATE,_SOS_DEBUG_NORMAL);
  8970. sosTIMERRegisterEvent(100,timetest,&TimerHandle);
  8971. for (i=0;i<20;i++)
  8972. {
  8973. render3d(&main_buff,0,20,0,1280,20,800,256,plyr,dp,NULL);
  8974. main_buff.dump(0,0);
  8975. }
  8976. sosTIMERRemoveEvent(TimerHandle);
  8977. sosTIMERUnInitSystem(0);
  8978. performance=2000/performance;
  8979. for (i=0;i<mappages+noloop+2;i++)
  8980. {
  8981. if (freeselector(mapsel[i]) < 0)
  8982. {
  8983. puts("Error freeing selectors");
  8984. exit(3);
  8985. }
  8986. }
  8987. freex(rotlist);
  8988. freex(ptslist);
  8989. freex(pollist);
  8990. freex(objlist);
  8991. freex(plyrtwtb);
  8992. freex(player_p);
  8993. freex(filters);
  8994. freex(textures);
  8995. freex(sky);
  8996. freex(scrb);
  8997. freex(maps);
  8998. timeit=0;
  8999. // return (performance);
  9000. return (31);
  9001. }
  9002. /****************/
  9003. /* JUGGLING MAN */
  9004. float balla;
  9005. float balld;
  9006. float ballly;
  9007. float ballld;
  9008. int jno;
  9009. void drawman(buff_info *buffer, float anim, float angle, int dist)
  9010. {
  9011. datapt targx,targy,targz,viewx,viewy,viewz,vdist;
  9012. short i,j;
  9013. objs *oldobj;
  9014. double hr,r;
  9015. mat tmp;
  9016. targx=targz=0;
  9017. targy=10;
  9018. viewx=dist*cos(angle);
  9019. viewy=40;
  9020. viewz=dist*sin(angle);
  9021. vdist=buffer->buff_wid;
  9022. // Set extended buffer info
  9023. render_buff.buff_start=buffer->buff_start;
  9024. render_buff.buff_wid=buffer->buff_wid;
  9025. render_buff.buff_hgt=buffer->buff_hgt;
  9026. render_buff.clip_wid=buffer->clip_wid;
  9027. render_buff.clip_hgt=buffer->clip_hgt;
  9028. render_buff.scale_x=buffer->scale_x;
  9029. render_buff.scale_y=buffer->scale_y;
  9030. render_buff.dump=buffer->dump;
  9031. render_buff.clip_endl=buffer->buff_start+buffer->clip_hgt*buffer->buff_wid;
  9032. render_buff.clip_end=render_buff.clip_endl-buffer->buff_wid;
  9033. render_buff.clip_widl=buffer->clip_wid-1;
  9034. render_buff.clip_hgtl=buffer->clip_hgt-1;
  9035. render_buff.clip_xmid=buffer->clip_wid>>1;
  9036. render_buff.clip_ymid=buffer->clip_hgt>>1;
  9037. // Set perspective based info
  9038. oq=vdist;
  9039. q=vdist*((buffer->scale_x+buffer->scale_y)/2);
  9040. qr=(floatpt)1/q;
  9041. qa=(floatpt)q*2/100;
  9042. scrdr=(float)1/SCREENDIST;
  9043. persc=q*scrdr;
  9044. // Prepare viewing vector vars
  9045. viewz=-viewz,targz=-targz;
  9046. targx-=viewx;
  9047. targy-=viewy;
  9048. targz-=viewz;
  9049. hr=targx*targx+targz*targz;
  9050. if (hr<1) hr=1,targz=1;
  9051. r=sqrt(hr+targy*targy);
  9052. hr=sqrt(hr);
  9053. cth=targz/hr;sth=targx/hr;
  9054. cph=hr/r;sph=targy/r;
  9055. // Make global rotation matrix
  9056. matcop(rot.arr,unit);
  9057. matcop(tran.arr,unit);
  9058. matcop(tmp,unit);
  9059. rot.arr[0][3]=-viewx;
  9060. rot.arr[1][3]=-viewy;
  9061. rot.arr[2][3]=-viewz;
  9062. tmp[0][0]=cth;
  9063. tmp[0][2]=-sth;
  9064. tmp[1][0]=-sth*sph;
  9065. tmp[1][1]=cph;
  9066. tmp[1][2]=-cth*sph;
  9067. tmp[2][0]=sth*cph;
  9068. tmp[2][1]=sph;
  9069. tmp[2][2]=cth*cph;
  9070. matmul(rot.arr,tmp);
  9071. clearlists
  9072. player[0].points=player_p[(short)(anim*jno)];
  9073. oldobj=curobj;
  9074. addobjy(&player[0]);
  9075. if (oldobj!=curobj) sortobj(oldobj);
  9076. ball.y=-player[0].points[1+23*3];
  9077. ball.z=player[0].points[1+23*3+2];
  9078. ball.x=-ball.y*player[0].crot+ball.z*player[0].srot+player[0].x;
  9079. ball.z=ball.y*player[0].srot+ball.z*player[0].crot+player[0].z;
  9080. ball.y=player[0].points[1+23*3+1]+player[0].y;
  9081. addobjxy(&ball,cos(balla),sin(balla));
  9082. if (anim<0.88)
  9083. {
  9084. balla+=balld;
  9085. balld*=0.89;
  9086. if (ball.y-ballly>0 && ballld<=0) balld+=0.16;
  9087. ballld=ball.y-ballly;
  9088. ballly=ball.y;
  9089. }
  9090. dispols();
  9091. }
  9092. int initman(int team, int capture)
  9093. {
  9094. int i,nheadfile;
  9095. word selector;
  9096. BYTE *seg;
  9097. BYTE *tptr;
  9098. if ( (maps=(mappage *)mallocx((mappages=4)*65536)) == NULL ) goto err1;
  9099. if ( (textures=(texture *)mallocx(600*sizeof(texture))) == NULL ) goto err2;
  9100. if ( (player_p=(capfrm *)mallocx(300*sizeof(capfrm))) == NULL ) goto err3;
  9101. if ( (objlist=(objs *)mallocx(5*sizeof(objs))) == NULL ) goto err4;
  9102. if ( (pollist=(pols *)mallocx(60*sizeof(pols))) == NULL ) goto err5;
  9103. if ( (ptslist=(scrpt *)mallocx(400*10*sizeof(scrpt))) == NULL ) goto err6;
  9104. if ( (rotlist=(rotpt *)mallocx(200*4*sizeof(rotpt))) == NULL ) goto err7;
  9105. if (readrawfile(dataoffs,(BYTE *)load_offsets) == NULL) goto err8;
  9106. if (opendatafile(datafile)<0) return(-1);
  9107. #ifndef BBS
  9108. if (teamlist[team].headfile==BM_XCAUCASB || teamlist[team].headfile==BM_XNORDIC)
  9109. nheadfile=BM_XCAUCASA;
  9110. else
  9111. #endif
  9112. nheadfile=teamlist[team].headfile;
  9113. if (
  9114. readfile(TMD_MANDATA,(BYTE *)&textures[1]) == NULL ||
  9115. readfile(PAL_FOOTY,pal) == NULL ||
  9116. readfile(nheadfile,maps[0]) == NULL ||
  9117. readfile(teamlist[team].torsofile,maps[1]) == NULL ||
  9118. readfile(teamlist[team].limbsfile,maps[3]) == NULL ||
  9119. readfile(BM_FEET,maps[3]+158*256) == NULL ||
  9120. readfile(teamlist[team].palfile,&pal[3*32]) == NULL ||
  9121. readfile(teamlist[team].skinfile,&pal[3*80]) == NULL
  9122. )
  9123. goto err8;
  9124. switch(capture)
  9125. {
  9126. case 0:
  9127. if (readfile(MPB_JUGGLE,(BYTE *)&player_p[0]) == NULL) goto err8;
  9128. jno=300;
  9129. break;
  9130. case 1:
  9131. if (readfile(MPB_CELEB,(BYTE *)&player_p[0]) == NULL) goto err8;
  9132. jno=118;
  9133. break;
  9134. }
  9135. closedatafile();
  9136. tptr=maps[0];
  9137. for (i=0;i<4*65536;i++) ++(*tptr++);
  9138. if ((selector=getselectors(mappages)) < 0)
  9139. {
  9140. puts("Error preparing selectors");
  9141. goto err8;
  9142. }
  9143. for (i=0;i<mappages;i++)
  9144. {
  9145. mapsel[i]=selector;
  9146. seg=maps[i];
  9147. if (setselector(selector,seg,65536) < 0)
  9148. {
  9149. puts("Error setting selectors");
  9150. goto err9;
  9151. }
  9152. selector+=nextselectordisp(selector);
  9153. }
  9154. initobj(&player[0],player_p[0],player_f1,0,0,0,1,0);
  9155. player[0].faces[0]=12;
  9156. initobj(&ball,footy_p,footy_f,0,0,0,1,0);
  9157. balla=0;
  9158. balld=0;
  9159. ballly=0;
  9160. ballld=0;
  9161. // setpal();
  9162. // testVESA=0;
  9163. // scrmode=VESAmode(&modelist[0]);
  9164. return (0);
  9165. err9:;
  9166. for (i=0;i<mappages;i++)
  9167. freeselector(mapsel[i]);
  9168. err8:;
  9169. freex(rotlist);
  9170. err7:;
  9171. freex(ptslist);
  9172. err6:;
  9173. freex(pollist);
  9174. err5:;
  9175. freex(objlist);
  9176. err4:;
  9177. freex(player_p);
  9178. err3:;
  9179. freex(textures);
  9180. err2:;
  9181. freex(maps);
  9182. err1:;
  9183. return (-1);
  9184. }
  9185. void endman()
  9186. {
  9187. int i;
  9188. for (i=0;i<mappages;i++)
  9189. {
  9190. if (freeselector(mapsel[i]) < 0)
  9191. {
  9192. puts("Error freeing selectors");
  9193. exit(3);
  9194. }
  9195. }
  9196. freex(rotlist);
  9197. freex(ptslist);
  9198. freex(pollist);
  9199. freex(objlist);
  9200. freex(player_p);
  9201. freex(textures);
  9202. freex(maps);
  9203. }
  9204.