/programs/games/StarTrek/trunk/Bin/MsgTable.txt |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/programs/games/StarTrek/trunk/Bin/ReadMe.txt |
---|
0,0 → 1,257 |
* ----------------------------------------------- * |
* THIS DOCUMENT IS LOOKING BEST WITH COURIER FONT * |
* ----------------------------------------------- * |
CONTENTS OF THIS FOLDER: |
- README.TXT - THIS FILE |
- STARTREK32.EXE - GAME EXECUTABLE FILE |
- STARTREK.DOC - ORIGINAL GAME INSTRUCTIONS |
- MSGTABLE.TXT - GAME MESSAGES (ENCRYPTED) |
- DO NOT EDIT MSG TABLE - REMINDER NOT TO OPEN IT IN EDITOR |
1. MODIFICATIONS TO ORIGINAL VERSION OF THIS GAME |
=================================================== |
WHEN I STARTED TESTING THE GAME, I NOTICED THAT NO MATTER HOW HARD |
I AM TRYING TO BEAT THE 'EMERITUS' LEVEL - THERE IS SIMPLY NOT MUCH |
LUCK ON MY SIDE. WELL, I DECIDED TO ADD SOME POWER-UPS TO REMEDY |
THIS SITUATION. |
1.1 WHEN 'DOCK' COMMAND IS EXECUTED SOMETIMES MORE PHOTON |
LAUNCHERS ARE ADDED, SO SHIP CAN FIRE MORE PHOTON TORPEDOES IN ONE |
BURST. THIS EVENT HAPPENS ONLY ONCE PER GAME (FOR NOW). |
THE NUMBER OF TORPEDOES PER BURST IS INDICATED ON 'TORPEDOES' LINE |
IN SHORT RANGE SCAN REPORT. MAXIMUM NUMBER OF ADDED LAUNCHERS IS |
THREE, SO IN ALL SHIP CAN HAVE UP TO SIX TORPEDOES FIRED PER BURST! |
1.2 WHEN 'DOCK' COMMAND IS EXECUTED IT IS POSSIBLE SOMETIMES TO |
RECEIVE QUANTUM TORPEDOES INSTEAD OF NORMAL ONES. THESE ARE NEW |
WARHEADS DESIGNED BY STARFLEET ENGINEER CORPS. THE QUANTUM CHARGES |
DO NOT SUFFER THE LOSS OF TARGETING WHEN PASSING THROUGH SHIELDS AS |
MUCH AS NORMAL TORPEDOES. AND OF COURSE, THEY PACK QUITE A PUNCH! |
"ENTERPRISE" WILL RECEIVE SIXTEEN QUANTUM CHARGES AND "FAERIE |
QUEENE" WILL GET EIGHT. THESE CHARGES MUST BE EXPENDED BEFORE THE |
NEXT DOCKING PROCEDURE, OTHERWISE THE TORPEDOES WILL NOT BE |
REFILLED BY THE BASE. SO, DO NOT SAVE YOUR QUANTUM TORPEDOERS! GET |
INTO SOME QUADRANT AND MAKE A SHOOTING GALLERY OUT OF POOR SUCKERS! |
ESPECIALLY IF YOU HAVE SIX PHOTON TUBES. |
I WAS THINKING TO ADD SOME NEW WAYS TO GATHER ENERGY IN GALAXY, BUT |
SO FAR NOTHING COMES TO MIND. IF YOU HAVE ANY IDEAS ON THAT I WILL |
BE GLAD TO HEAR IT. |
1.3 ANOTHER NICE TO HAVE MODIFICATION IS THAT OUTPUT HAS TRUE |
COLOURS. THESE COLOURS ARE NOT STANDARD WIN32 CONSOLE COLOURS, |
BUT IN FACT, MY CONSOLE WINDOW IS A REAL WIN32 WINDOW, SIMULATING A |
CONSOLE I/O. |
1.4 SOME DELAY ADDED WHEN OUTPUTTING LARGE AMOUNTS OF DATA - IT |
IMPROVES READABILITY, SINCE I HAVE NOT IMPLEMENTED THE SCROLLING OF |
MY CONSOLE WINDOW (FOR NOW). |
1.5. NEW 'LOG' COMMAND ADDED INTO THE GAME. IT ALLOWS SAVING ALL |
GAME I/O INTO THE FILE CALLED 'STARTREK.LOG'. THIS FILE IS RE- |
CREATED EACH GAME, SO IF YOU NEED TO ANALYSE ANY PREVIOUS GAMES YOU |
HAVE TO RENAME THAT FILE AFTER THE GAME. |
1.6 SINCE I HAVE TRUE COLOURS IN THE GAME I DECIDED TO IMPROVE |
THE GALAXY CHART. ALL QUADRANTS WHERE 'SRSCAN' COMMAND WAS GIVEN |
WILL BE HIGHLIGHTED WITH DIFFERENT COLOUR. IT MAY BE USEFUL IN |
LOCATING A PLANET. ALSO, THE SHIP'S QUADRANT IS HIGHLIGHTED TOO. |
2. SOME STRATEGY HINTS |
====================== |
"STAR TREK" IS A GAME OF STRATEGY. I GOT THAT WHILE PLAYING |
IT DURING MY TESTING PHASE - I WAS PLAYING FOR HOURS EVERY DAY! |
I GOT A LOT OF BUGS FIXED, AND AT THE SAME TIME I GOT SOME INSIGHTS |
INTO THE GAME. MOST OF THESE CAME WITH A KNOWLEDGE OF READING THE |
SOURCE CODE FROM PDP-11. HOWEVER, I CAN ADD SOME OF MY OWN. AND, |
OF COURSE, SOME LUCK IS MUCH NEEDED, ESPECIALLY ON THE "EMERITUS"! |
SO, LET'S BEGIN!.. |
2.1 IMAGINE THAT YOU HEAR ON SUBSPACE, THAT A BASE IS UNDER |
ATTACK AND YOU REALISE THAT TO GET THERE AT WARP 5 OR EVEN AT WARP |
6 IS NOT POSSIBLE. YOU HAVE THE ENERGY, BUT THE MOVE WITH WARPS |
OVER 6 WILL DAMAGE THE ENGINES AND YOU'LL GET STRANDED OR YOU'LL |
HAVE TO DRAG AT WARP 4. IN SUCH A CASE I USE WARP 8, BUT I MAKE |
SHORT TRIPS - EACH TRIP IS NO LONGER THAN 5 SECTORS. THERE IS A |
PROBABILITY OF DAMAGING THE ENGINES, BUT THAT PROBABILITY IS MUCH |
LOWER FOR SHORT JUMPS. ALSO, GO WITH SHIELDS DOWN TO SAVE ENERGY. |
IF YOU GET TRACTORED - YOU'LL HAVE A CHANCE TO RAISE SHIELDS FOR |
BATTLE. IN FACT, ALWAYS LOWER SHIELDS, WHEN BATTLE IS OVER. |
2.2 IF YOU REALISE THAT BASE WILL BE DESTROYED AND YOU STILL IN |
A NEIGHBOURING QUADRANT AND NOT ENOUGH TIME TO GET TO BASE - 'HELP' |
COMMAND CAN BE USED TO JUMP STRAIGHT INTO DOCK. HOWEVER, THIS MAY |
END BADLY, BECAUSE 'HELP' COMMAND IS PRONE TO RE-MATERIALIZATION |
FAILURE AND YOU'LL LOSE THE GAME. ON THE OTHER HAND, JAMES T. KIRK |
LOVES TO RISK! AND YOU ARE BECOME HIM, REMEMBER?.. |
2.3 WHEN YOU ENTER THE QUADRANT WITH ENEMIES - THEY ATTACK |
RIGHT AWAY. YOU CAN ATTACK WHEN THEIR ATTACK IS OVER, HOWEVER, YOU |
HAVE ONE CHANCE TO MOVE BEFORE ATTACKING, SO USE IT WISELY. FOR |
EXAMPLE, YOU CAN FLY INTO THE MIDDLE OF ENEMIES, SO YOUR WEAPONS |
WOULD BE MORE EFFECTIVE ON THE SHORT DISTANCE. IT WORKS FOR BOTH |
PHASERS (LESS ENERGY SPENT ON A BURST) AND TORPEDOES (PRECISION AND |
HIT ENERGY WILL BE INTENSIFIED). |
2.4 SIMPLE FACT: WHEN STAR IS HIT BY A TORPEDO - IT BECOMES A |
NOVA. NOVA DESTROYS (OR HEAVILY DAMAGES) ALL OBJECTS IN 8 ADJACENT |
SECTORS. YOU CAN USE IT IN BATTLE. IF YOU HAVE ONLY 2 TORPEDOES |
LEFT, BUT THERE ARE 5 KLINGONS IN THE QUADRANT, HOWEVER, THESE |
ENEMIES ARE ADJACENT TO TWO STARS. THEY ARE UNLUCKY ONES! FLY INTO |
A POSITION, WHERE YOUR TORPEDOES WILL SURELY HIT THOSE STARS AND |
FIRE! ENEMIES WILL BE DESTROYED (MOST LIKELY). THERE IS A SMALL |
PROBABILITY THAT NOVA CAN BECOME A SUPERNOVA - THAT WOULD BE BAD. I |
ONCE EXPERIENCED THAT IN MY TESTING. |
2.5 BEWARE OF ROMULANS! - THEY HAVE MORE POWER THAN MOST |
KLINGONS. ALSO, THEY USUALLY FIRE TORPEDOES - NOT A GOOD PROSPECT. |
TRY TO KILL OFF ROMULANS (AND COMMANDERS) FIRST WHEN IN BATTLE. |
2.6 ALWAYS TRY TO ENTER THE CORNER SECTOR OF A QUADRANT WITH |
ENEMIES OR CLOSE TO CORNER SECTOR. IT MINIMIZES THE ENEMY POWER |
AND THEY CANNOT INFLICT AS MUCH DAMAGE AS IF YOU ENTER THE SECTOR |
5-5. ALSO, IF YOU AT CORNER SECTOR - IT KEEPS THE THOLIAN FROM |
MOVING AND WEAVING ITS WEB. |
2.7 SOMETIMES YOU NEED A QUICK SCAN OF THE GALAXY. IT CAN BE |
DONE WITHOUT TOO MUCH ENERGY SPENT ON FLIGHT. SIMPLY FLY INTO ANY |
CORNER OF THE QUADRANT AND THEN MOVE JUST ONE SECTOR TO GET TO THE |
ADJACENT QUADRANT AND GIVE BOTH 'SRSCAN' AND 'LRSCAN' COMMANDS. BY |
DOING IT ONLY THREE TIMES (3 SECTORS TRAVELLED) YOU CAN SCAN FOUR |
QUADRANTS ON SHORT RANGE AND TWELVE ON LONG RANGE. |
2.8 AFTER THE BATTLE ALWAYS KEEP YOUR SHIELDS ON FULL OR CLOSE |
TO FULL. YOU CAN BE TRACTORED BY A COMMANDER AT ANY TIME AND YOU |
WILL NOT BE ABLE TO TRANSFER THE ENERGY - ONLY TO RAISE SHIELDS. |
2.9 HOW TO FIGHT A LOT OF KLINGONS? IMAGINE THAT YOU ENTER A |
QUADRANT AND IT HAS SEVEN KLINGONS OR MORE. EXPERIENCE SHOWS THAT |
TO KILL ALL ENEMIES WITH PHASER IS NOT FEASIBLE WITHOUT OVERHEATING |
PHASERS. IN THIS CASE THE MANUAL PHASER FIRE WILL HELP. USING |
THIS METHOD YOU CAN SEE HOW MUCH ENERGY IS NEEDED TO KILL EACH |
ENEMY. SIMPLY ENTER FOR EACH ENEMY SOME AMOUNT OF FIRE KEEPING IN |
MIND THAT PHASERS BEGIN OVERHEATING AT MORE THAN 1500 UNITS IN |
TOTAL. THE OVERHEATING IS HIGHLY RANDOM - I ONCE FIRED 2500 AT |
SUPER-COMMANDER IN A FAR DISTANCE (COULD NOT MOVE CLOSER) AND MY |
PHASERS WERE NOT OVERHEATED! SO, WHEN YOU ENTER THE MANUAL AMOUNTS |
FOR EACH ENEMY AND FIRE - IT WILL WEAKEN THE ENEMIES, SO THEY WILL |
NOT BE ABLE TO FIRE AS MUCH IN THEIR NEXT WAVE OF ATTACK. USUALLY, |
YOUR SECOND PHASER SHOT WILL KILL ALL SEVEN KLINGONS. YOUR RESULTS |
MAY VARY, HOWEVER! THAT'S WHY THIS GAME IS SO ADDICTIVE! ANYTHING |
CAN HAPPEN DURING BATTLE! |
2.10 IF THE ENEMY IS CLOSE TO BLACK HOLE (PREFERABLY 1 SECTOR |
DISTANCE) - IT IS POSSIBLE TO DISPLACE THAT ENEMY INTO A BLACK HOLE |
WITH A TORPEDO FIRED ON THE SAME VECTOR. I ONCE WAS IN A SITUATION |
DEPICTED BELOW AND WAS ABLE TO KILL SUPER-COMMANDER WITH JUST ONE |
NORMAL TORPEDO! |
. E . . S @ . . . |
3. NEED FOR IMPROVEMENT |
======================= |
3.1 I WOULD BE HAPPY TO HEAR SOME NEW IDEAS ABOUT THE GAME. YOU |
CAN E-MAIL ME (asmguru62@hotmail.com) TO GIVE AN INSIGHT OR ADVICE. |
3.2 I WAS NOT HAPPY TO DISCOVER (READING THE SOURCE CODE) THAT |
COMMANDER'S TRACTOR BEAM WORKS ON A GREAT DISTANCES. BASICALLY, |
THE SHIP CAN BE PULLED FROM ONE CORNER OF THE GALAXY TO THE OTHER!! |
THAT DOES NOT SEEM LOGICAL TO ME. I WANTED TO ADJUST THE GAME, SO |
THE DISTANCE WILL BE A FACTOR, BUT I LEFT THAT AS IS - TO PRESERVE |
THE ORIGINAL IDEA FOR NOW. |
3.3 BUGS!! OF COURSE, I AM GLAD TO HEAR SOME BUG REPORTS. LET'S |
MAKE IT A NICE GAMING EXPERIENCE - 70s STYLE!.. DURING TESTING I |
HAVE SEEN SOME STRANGE ISSUES, HOWEVER, I WAS NOT ABLE TO REPRODUCE |
THESE IN A CONSISTENT MANNER. |
3.4 TAKE A LOOK AT POSITION BELOW: |
1 2 3 4 5 |
1 E * . . . |
2 . . . . . |
TO MOVE TO SECTOR 2-2 THE SHIP NEEDS TO TRAVEL AT 45 DEGREE ANGLE |
DOWN AND TO THE RIGHT AND IT SEEMS LIKE NOTHING IN THE WAY. BEWARE |
OF SUCH CONDITION - IN MOST CASES THE SHIP WILL BE BLOCKED BY STAR |
AT SECTOR 1-2. I ANALYSED THE CODE AND IT SEEMS, WHEN SHIP MOVES, |
IT WILL APPROXIMATE ITS LOCATION TO THE NEAREST SECTOR WITH HALF |
SECTOR PRECISION. FOR EXAMPLE: SECTOR 1-1.5 WILL BE ROUNDED TO |
SECTOR 1-2 AND THIS WILL CAUSE COLLISION WITH OBJECT AT THAT SECTOR |
IF ANY. THAT SEEMS ILLOGICAL, AS SPOCK WOULD SAY. HALF OF THE |
SECTOR CANNOT BE COMPARED WITH THE SHIP'S LENGTH TO BE ABLE TO |
COLLIDE WITH ANYTHING. I ALSO, LEFT THAT FACT INTACT FROM ORIGINAL |
CODE. SIMPLY DO NOT PLOT YOUR COURSE TOO CLOSE TO OTHER OBJECTS. |
THE SAME CONDITION EXISTS FOR TORPEDOES TOO, BECAUSE THE SAME CODE |
IS USED TO MOVE A TORPEDO. |
4. FASM SOURCE CODE |
=================== |
I HAVE INSERTED THE ORIGINAL COPYRIGHT NOTE FROM PDP-11 FORTRAN |
SOURCE. YOU CAN MODIFY THE CODE, BIT ONLY FOR FUN - NOT FOR PROFIT. |
THE SOURCE CODE WAS NOT WRITTEN TO BE FAST. IT WAS WRITTEN TO MIMIC |
EXACTLY THE LOGIC OF FORTRAN SOURCE. PLEASE DO NOT ASK ME TO MAKE |
OPTIMIZATIONS IN THE CODE - IT WILL NEVER BE DONE. I USED MY OWN |
IDE FOR FASM TO CREATE THAT CODE. YOU CAN LOOK AT THE DATES IN |
FILES AND FIGURE OUT HOW MUCH TIME IT TOOK TO WRITE THAT CODE. THIS |
WAS MY THIRD (!) ATTEMPT TO RE-CREATE ONE OF MY FAVOURITE GAMES. |
IN THE FIRST ATTEMPT I TRIED TO RE-DESIGN THE ORIGINAL SOURCE TO BE |
MORE STRUCTURED. NO NEED TO SAY - IT FAILED MISERABLY! THE LOGIC |
IN SOME CASES WAS LOST. |
IN THE SECOND ATTEMPT I WROTE THE FASM CODE TO MIMIC FORTRAN CODE |
EXACTLY. HOWEVER, I FAILED TO SEE THAT THERE SHOULD BE TWO THREADS. |
ONE THREAD SHOULD RUN THE CONSOLE WINDOW AND THE OTHER ONE SHOULD |
DEAL WITH GAME LOGIC: QUESTIONS AND ANSWERS FROM CONSOLE. |
WELL, THIRD TIME'S A CHARM! |
AsmGuru62 |
August 23, 2009 |
/programs/games/StarTrek/trunk/Bin/do not edit msg table |
---|
--- games/StarTrek/trunk/Bin/startrek.doc (nonexistent) |
+++ games/StarTrek/trunk/Bin/startrek.doc (revision 1812) |
@@ -0,0 +1,1436 @@ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ SSSSSSS TTTTTTTT A RRRRRRR |
+ SSSSSSSS TTTTTTTT AAA RRRRRRRR |
+ SS TT AAA RR RR |
+ SSSSSSS TT AA AA RR RR |
+ SSSSSSS TT AA AA RRRRRRRR |
+ SS TT AAAAAAA RRRRRRR |
+ SS TT AAAAAAA RR RR |
+ SSSSSSSS TT AA AA RR RR |
+ SSSSSSS TT AA AA RR RR |
+ |
+ |
+ |
+ TTTTTTTT RRRRRRR EEEEEEEEE KK KK |
+ TTTTTTTT RRRRRRRR EEEEEEEEE KK KK |
+ TT RR RR EE KK KK |
+ TT RR RR EEEEEE KKKKKK |
+ TT RRRRRRRR EEEEEE KKKKK |
+ TT RRRRRRR EE KK KK |
+ TT RR RR EE KK KK |
+ TT RR RR EEEEEEEEE KK KK |
+ TT RR RR EEEEEEEEE KK KK |
+ |
+ |
+ |
+ PRODUCED FOR YOUR ENJOYMENT |
+ |
+ BY |
+ |
+ DAVID MATUSZEK |
+ AND |
+ PAUL REYNOLDS |
+ |
+ WITH MODIFICATIONS BY |
+ DON SMITH |
+ AND |
+ M. KELLOGG |
+ |
+ |
+ |
+ |
+ PERMISSION IS HEREBY GRANTED FOR THE COPYING, DISTRIBUTION, |
+ MODIFICATION AND USE OF THIS PROGRAM AND ASSOCIATED DOCUMENTATION |
+ FOR RECREATIONAL PURPOSES, PROVIDED THAT ALL REFERENCES TO THE |
+ AUTHORS ARE RETAINED. HOWEVER, PERMISSION IS NOT AND WILL NOT BE |
+ GRANTED FOR THE SALE OR PROMOTIONAL USE OF THIS PROGRAM OR PROGRAM |
+ DOCUMENTATION, OR FOR USE IN ANY SITUATION IN WHICH PROFIT MAY BE |
+ CONSIDERED AN OBJECTIVE, SINCE IT IS THE DESIRE OF THE AUTHORS TO |
+ RESPECT THE COPYRIGHTS OF THE ORIGINATORS OF STAR TREK. |
+ |
+ |
+ ----------TABLE OF CONTENTS---------- |
+ |
+ |
+ |
+ SECTION PAGE |
+ |
+ |
+ INTRODUCTION TO THE GAME . . . . . . . . . . . . . . 1 |
+ |
+ HOW TO ISSUE COMMANDS. . . . . . . . . . . . . . . . 4 |
+ |
+ DESCRIPTIONS OF COMMANDS . . . . . . . . . . . . . . 5 |
+ |
+ SHORT-RANGE SCAN. . . . . . . . . . . . . . . . 5 |
+ STATUS REPORT . . . . . . . . . . . . . . . . . 6 |
+ LONG-RANGE SCAN . . . . . . . . . . . . . . . . 7 |
+ STAR CHART. . . . . . . . . . . . . . . . . . . 8 |
+ DAMAGE REPORT . . . . . . . . . . . . . . . . . 8 |
+ MOVE UNDER WARP DRIVE . . . . . . . . . . . . . 8 |
+ WARP FACTOR . . . . . . . . . . . . . . . . . . 10 |
+ IMPULSE ENGINES . . . . . . . . . . . . . . . . 10 |
+ DEFLECTOR SHIELDS . . . . . . . . . . . . . . . 11 |
+ PHASERS . . . . . . . . . . . . . . . . . . . . 12 |
+ PHOTON TORPEDOES. . . . . . . . . . . . . . . . 13 |
+ DOCK AT STARBASE. . . . . . . . . . . . . . . . 14 |
+ REST. . . . . . . . . . . . . . . . . . . . . . 14 |
+ CALL STARBASE FOR HELP. . . . . . . . . . . . . 14 |
+ ABANDON SHIP. . . . . . . . . . . . . . . . . . 15 |
+ SELF-DESTRUCT . . . . . . . . . . . . . . . . . 15 |
+ TERMINATE THE CURRENT GAME. . . . . . . . . . . 15 |
+ SENSOR-SCAN . . . . . . . . . . . . . . . . . . 16 |
+ ENTER STANDARD ORBIT. . . . . . . . . . . . . . 16 |
+ TRANSPORTER-TRAVEL. . . . . . . . . . . . . . . 16 |
+ SHUTTLE CRAFT . . . . . . . . . . . . . . . . . 17 |
+ MINE DILITHIUM CRYSTALS . . . . . . . . . . . . 17 |
+ LOAD DILITHIUM CRYSTALS . . . . . . . . . . . . 17 |
+ PLANET REPORT . . . . . . . . . . . . . . . . . 18 |
+ FREEZE. . . . . . . . . . . . . . . . . . . . . 18 |
+ REQUEST . . . . . . . . . . . . . . . . . . . . 19 |
+ EXPERIMENTAL DEATH RAY. . . . . . . . . . . . . 19 |
+ EMERGENCY EXIT. . . . . . . . . . . . . . . . . 20 |
+ GAME REPORT . . . . . . . . . . . . . . . . . . 20 |
+ |
+ MISCELLANEOUS NOTES. . . . . . . . . . . . . . . . . 21 |
+ |
+ SCORING. . . . . . . . . . . . . . . . . . . . . . . 22 |
+ |
+ MODIFICATIONS. . . . . . . . . . . . . . . . . . . . 23 |
+ |
+ HANDY REFERENCE PAGE . . . . . . . . . . . . . . . . 24 |
+ |
+ ACKNOWLEDGMENTS. . . . . . . . . . . . . . . . . . . 25 |
+ |
+ REFERENCES . . . . . . . . . . . . . . . . . . . . . 25 |
+ |
+ 1 |
+ ----------INTRODUCTION TO THE GAME---------- |
+ |
+ |
+ THE ORGANIAN PEACE TREATY HAS COLLAPSED, AND THE FEDERATION |
+ IS AT WAR WITH THE KLINGON EMPIRE. JOINING THE KLINGONS AGAINST |
+ THE FEDERATION ARE THE MEMBERS OF THE "ROMULAN STAR EMPIRE". AS |
+ COMMANDER OF THE STARSHIP U. S. S. ENTERPRISE, YOUR JOB IS TO WIPE |
+ OUT THE KLINGON INVASION FLEET AND MAKE THE GALAXY SAFE FOR |
+ DEMOCRACY. |
+ |
+ YOUR BATTLEGROUND IS THE ENTIRE GALAXY, WHICH FOR CONVENIENCE |
+ IS DIVIDED UP INTO EIGHT ROWS OF EIGHT QUADRANTS EACH, LIKE A |
+ CHECKERBOARD. ROWS ARE NUMBERED FROM TOP TO BOTTOM, AND COLUMNS |
+ ARE NUMBERED LEFT TO RIGHT, SO QUADRANT 1 - 8 WOULD BE IN THE |
+ UPPER RIGHT HAND CORNER OF THE GALAXY. |
+ |
+ DURING BATTLE YOU WILL BE CONCERNED ONLY WITH THOSE ENEMIES |
+ THAT OCCUPY THE SAME QUADRANT AS YOURSELF. QUADRANTS ARE DIVIDED |
+ UP INTO SECTORS: TEN ROWS OF TEN SECTORS EACH. SECTORS ARE |
+ NUMBERED IN THE SAME WAY AS QUADRANTS, SO THE SECTOR IN THE UPPER |
+ RIGHT CORNER IS SECTOR 1 - 10. YOU HAVE A SHORT-RANGE SCANNER |
+ WHICH ALLOWS YOU TO LOOK AT THE ENTIRE QUADRANT IN A SINGLE |
+ DISPLAY. |
+ |
+ ENEMIES RECHARGE DURING YOUR ABSENCE. IF YOU LEAVE A QUADRANT |
+ CONTAINING A WEAKENED ENEMY, WHEN YOU RETURN TO THAT QUADRANT HE |
+ WILL BE STRONG AGAIN. ALSO, EACH TIME YOU ENTER A QUADRANT, THE |
+ POSITIONS OF EVERYTHING IN THE QUADRANT (EXCEPT YOUR SHIP) ARE |
+ RANDOMIZED, TO SAVE YOU THE TROUBLE OF TRYING TO REMEMBER WHERE |
+ EVERYTHING IN THE QUADRANT IS. NOTICE THAT THIS REFERS ONLY TO |
+ THE POSITIONS OF THINGS IN THE QUADRANT--THE NUMBERS OF EACH KIND |
+ OF THING ARE NOT CHANGED. IF YOU KILL SOMETHING, IT STAYS DEAD. |
+ |
+ THE ROMULANS ARE NOT AS SERIOUS A THREAT TO THE FEDERATION |
+ AS THE KLINGONS. FOR ONE THING, THERE ARE NOT AS MANY OF THEM. |
+ FOR ANOTHER, THE ROMULANS ARE NOT AS TREACHEROUS. HOWEVER, ROMULANS |
+ ARE NOT TO BE TRIFLED WITH, ESPECIALLY WHEN YOU ARE IN VIOLATION |
+ OF THE "ROMULAN NEUTRAL ZONE". |
+ |
+ THERE ARE TWO KINDS OF KLINGONS: ORDINARY KLINGONS, WHICH |
+ ARE BAD ENOUGH, AND KLINGON COMMANDERS, WHICH ARE EVEN WORSE. |
+ COMMANDERS ARE ABOUT THREE TIMES STRONGER THAN ORDINARY KLINGONS. |
+ COMMANDERS ARE MORE RESISTANT TO YOUR WEAPONS. COMMANDERS CAN |
+ MOVE ABOUT DURING BATTLE, WHILE ORDINARY KLINGONS STAY PUT. AND |
+ FINALLY, COMMANDERS HAVE A THING CALLED A "LONG-RANGE TRACTOR |
+ BEAM" WHICH THEY CAN USE, AT RANDOM INTERVALS, TO YANK YOU AWAY |
+ FROM WHAT YOU ARE DOING AND INTO THEIR QUADRANT, TO DO BATTLE WITH |
+ THEM. THERE IS ALSO A SPECIAL COMMANDER, CALLED THE "SUPER-COMMANDER". |
+ THIS CHARACTER IS SO BAD, HE IS RESERVED FOR THE GOOD, EXPERT AND |
+ EMERITUS GAMES. FORTUNATELY, THERE IS JUST ONE "SUPER-COMMANDER" |
+ IN A GAME. IN ADDITION TO THE UNDESIRABLE TRAITS OF COMMANDERS, HE |
+ CAN MOVE FROM QUADRANT TO QUADRANT AT WILL, SEEKING OUT AND DESTROYING |
+ YOUR STARBASES, AND ANY HELPFUL PLANETS HE RUNS ACROSS. HE ALSO HAS |
+ A SPY PLANTED ABOARD YOUR SHIP, GIVING HIM VALUABLE INFORMATION |
+ ABOUT YOUR CONDITION. USING THIS INFORMATION, HE CAN DO DASTARDLY |
+ THINGS LIKE TRACTOR BEAM YOUR SHIP WHEN YOU ARE IN BAD SHAPE. AND |
+ ONCE YOU'VE BEEN TRACTOR BEAMED BY THE "SUPER-COMMANDER" - - - |
+ |
+ 2 |
+ BUT THE ADVANTAGES ARE NOT ALL ON THE SIDE OF THE ENEMY. |
+ YOUR SHIP IS MORE POWERFUL, AND HAS BETTER WEAPONS. BESIDES, |
+ IN THIS GALAXY THERE ARE FROM TWO TO FIVE STARBASES, AT WHICH |
+ YOU CAN STOP TO REFUEL AND LICK YOUR WOUNDS, SAFE FROM ATTACK |
+ OR TRACTOR BEAMS. BUT YOU HAD BEST NOT DALLY THERE TOO LONG, |
+ SINCE TIME IS NOT ON YOUR SIDE. THE KLINGONS ARE NOT JUST AFTER |
+ YOU; THEY ARE ATTACKING THE ENTIRE FEDERATION. THERE IS ALWAYS |
+ A FINITE "TIME LEFT", WHICH IS HOW MUCH LONGER THE FEDERATION CAN |
+ HOLD OUT IF YOU JUST SIT ON YOUR FAT BEHIND AND DO NOTHING. AS |
+ YOU WIPE OUT KLINGONS, YOU REDUCE THE RATE AT WHICH THE INVASION |
+ FLEET WEAKENS THE FEDERATION, AND SO THE "TIME LEFT" UNTIL |
+ THE FEDERATION COLLAPSES MAY ACTUALLY INCREASE. SINCE KLINGONS |
+ ARE THE MAIN THREAT TO THE FEDERATION, THE ROMULANS DO NOT FIGURE |
+ INTO THE "TIME LEFT". IN FACT, YOU NEED NOT KILL ALL THE ROMULANS |
+ TO WIN. IF YOU CAN GET ALL THE KLINGONS, THE FEDERATION WILL |
+ ABIDE FOREVER, AND YOU HAVE WON THE GAME. |
+ |
+ SPACE IS VAST, AND IT TAKES PRECIOUS TIME TO MOVE FROM ONE |
+ PLACE TO ANOTHER. IN COMPARISON, OTHER THINGS HAPPEN SO QUICKLY |
+ THAT WE ASSUME THEY TAKE NO TIME AT ALL. TWO WAYS THAT TIME |
+ CAN PASS ARE WHEN YOU MOVE, OR WHEN YOU ISSUE A COMMAND TO SIT |
+ STILL AND REST FOR A PERIOD OF TIME. YOU WILL SOMETIMES WANT |
+ TO DO THE LATTER, SINCE THE VARIOUS DEVICES ABOARD YOUR STARSHIP |
+ MAY BE DAMAGED AND REQUIRE TIME TO REPAIR. OF COURSE, REPAIRS |
+ CAN BE MADE MORE QUICKLY AT A STARBASE THAN THEY CAN IN FLIGHT. |
+ |
+ IN ADDITION TO KLINGONS, ROMULANS AND STARBASES, THE GALAXY |
+ CONTAINS (SURPRISE) STARS. MOSTLY, STARS ARE A NUISANCE AND |
+ JUST GET IN YOUR WAY. YOU CAN TRIGGER A STAR INTO GOING NOVA |
+ BY SHOOTING ONE OF YOUR PHOTON TORPEDOES AT IT. WHEN A STAR |
+ NOVAS, IT DOES A LOT OF DAMAGE TO ANYTHING IMMEDIATELY ADJACENT |
+ TO IT. IF ANOTHER STAR IS ADJACENT TO A NOVA, IT TOO WILL GO |
+ NOVA. STARS MAY ALSO OCCASIONALLY GO SUPERNOVA; A SUPERNOVA |
+ IN A QUADRANT DESTROYS EVERYTHING IN THE QUADRANT AND MAKES |
+ THE QUADRANT PERMANENTLY UNINHABITABLE. YOU MAY "JUMP OVER" A |
+ QUADRANT CONTAINING A SUPERNOVA WHEN YOU MOVE, BUT YOU SHOULD |
+ NOT STOP THERE. |
+ |
+ SUPERNOVAS MAY HAPPEN SPONTANEOUSLY, WITHOUT PROVOCATION. IF |
+ A SUPERNOVA OCCURS IN THE SAME QUADRANT YOU ARE IN, YOUR STARSHIP |
+ HAS AN "EMERGENCY AUTOMATIC OVERRIDE" WHICH PICKS SOME RANDOM |
+ DIRECTION AND SOME RANDOM WARP FACTOR, AND TRIES TO THROW YOU |
+ CLEAR OF THE SUPERNOVA. IF THE SUPERNOVA OCCURS IN SOME OTHER |
+ QUADRANT, YOU JUST GET A WARNING MESSAGE FROM STARFLEET ABOUT IT |
+ (PROVIDED, OF COURSE, THAT YOUR SUBSPACE RADIO IS WORKING). |
+ |
+ ALSO A FEW PLANETS ARE SCATTERED THROUGH THE GALAXY. THESE |
+ CAN SOMETIMES BE A GREAT HELP SINCE SOME OF THEM WILL HAVE |
+ "DILITHIUM CRYSTALS", WHICH ARE CAPABLE OF REPLENISHING THE |
+ SHIP'S ENERGY SUPPLY. YOU CAN EITHER BEAM DOWN TO THE PLANET |
+ SURFACE USING THE TRANSPORTER, OR TAKE THE SHUTTLE CRAFT "GALILEO". |
+ |
+ 3 |
+ STAR TREK IS A RICH GAME, FULL OF DETAIL. THESE INSTRUCTIONS |
+ ARE WRITTEN AT A MODERATE LEVEL--NO ATTEMPT HAS BEEN MADE FULLY |
+ TO DESCRIBE EVERYTHING ABOUT THE GAME, BUT THERE IS QUITE A BIT |
+ MORE HERE THAN YOU NEED TO GET STARTED. IF YOU ARE NEW TO THE |
+ GAME, JUST GET A ROUGH IDEA OF THE KINDS OF COMMANDS AVAILABLE, |
+ AND START PLAYING. AFTER A GAME OR TWO YOU WILL HAVE LEARNED |
+ EVERYTHING IMPORTANT, AND THE DETAILED COMMAND DESCRIPTIONS WHICH |
+ FOLLOW WILL BE A LOT MORE MEANINGFUL TO YOU. |
+ |
+ YOU HAVE WEAPONS: PHASERS AND PHOTON TORPEDOES. YOU HAVE |
+ A DEFENSE: DEFLECTOR SHIELDS. YOU CAN LOOK AT THINGS: LONG- |
+ RANGE SCANNERS, SHORT-RANGE SCANNERS, AND A STAR CHART. YOU CAN |
+ MOVE ABOUT, UNDER WARP DRIVE OR IMPULSE POWER. YOU CAN ALSO |
+ DOCK AT A STARBASE, REST WHILE REPAIRS ARE BEING MADE, ABANDON |
+ SHIP, SELF DESTRUCT, OR GIVE UP AND START A NEW GAME. |
+ |
+ THE KLINGONS ARE WAITING. |
+ |
+ 4 |
+ |
+ ----------HOW TO ISSUE COMMANDS---------- |
+ |
+ |
+ WHEN THE GAME IS WAITING FOR YOU TO ENTER A COMMAND, IT WILL |
+ PRINT OUT |
+ COMMAND: |
+ YOU MAY THEN TYPE IN YOUR COMMAND. ALL YOU HAVE TO REMEMBER FOR |
+ EACH COMMAND IS THE MNEMONIC. FOR EXAMPLE, IF YOU WANT TO MOVE |
+ STRAIGHT UP FOR ONE QUADRANT, YOU CAN TYPE IN THE MNEMONIC |
+ MOVE |
+ AND THE COMPUTER WILL PROMPT YOU WITH |
+ MANUAL OR AUTOMATIC? |
+ SAY YOU TYPE IN "MANUAL". THE COMPUTER THEN RESPONDS |
+ X AND Y DISPLACEMENTS: |
+ NOW YOU TYPE IN 0 1 WHICH SPECIFIES AN X MOVEMENT OF ZERO AND |
+ A Y MOVEMENT OF 1. |
+ |
+ WHEN YOU HAVE LEARNED THE COMMANDS, YOU CAN AVOID BEING |
+ PROMPTED BY SIMPLY TYPING IN THE INFORMATION WITHOUT WAITING |
+ TO BE ASKED FOR IT. FOR EXAMPLE, IN THE ABOVE EXAMPLE, YOU |
+ COULD SIMPLY TYPE IN |
+ MOVE MANUAL 0 1 |
+ AND IT WILL BE DONE. OR YOU COULD TYPE IN |
+ MOVE MANUAL |
+ AND WHEN THE COMPUTER RESPONDS WITH |
+ X AND Y DISPLACEMENTS: |
+ YOU CAN TYPE IN |
+ 0 1 |
+ AND IT WILL UNDERSTAND. |
+ |
+ YOU CAN ABBREVIATE MOST MNEMONICS. FOR "MOVE", YOU CAN USE |
+ ANY OF |
+ MOVE MOV MO M |
+ SUCCESSFULLY. FOR YOUR SAFETY, CERTAIN CRITICAL COMMANDS (SUCH |
+ AS TO ABANDON SHIP) MUST BE WRITTEN OUT IN FULL. ALSO, IN A |
+ FEW CASES TWO OR MORE COMMANDS BEGIN WITH THE SAME LETTER, AND |
+ IN THIS CASE THAT LETTER REFERS TO A PARTICULAR ONE OF THE |
+ COMMANDS; TO GET THE OTHER, YOUR ABBREVIATION MUST BE TWO OR |
+ MORE LETTERS LONG. THIS SOUNDS COMPLICATED, BUT YOU WILL LEARN |
+ THE ABBREVIATIONS QUICKLY ENOUGH. |
+ |
+ WHAT THIS ALL BOILS DOWN TO IS: |
+ (1) YOU CAN ABBREVIATE PRACTICALLY ANYTHING, |
+ (2) IF YOU FORGET, THE COMPUTER WILL PROMPT YOU, |
+ (3) IF YOU REMEMBER, YOU CAN TYPE IT ALL ON ONE LINE. |
+ |
+ IF YOU ARE PART WAY THROUGH ENTERING A COMMAND AND YOU CHANGE |
+ YOUR MIND, YOU CAN CANCEL THE COMMAND BY TYPING A -1 AS ONE OF THE |
+ PARAMETERS. |
+ |
+ IF ANYTHING IS NOT CLEAR TO YOU, EXPERIMENT. THE WORST YOU CAN |
+ DO IS LOSE A GAME OR TWO. |
+ |
+ 5 |
+ ----------DESCRIPTIONS OF COMMANDS---------- |
+ |
+ |
+ |
+ ******************** |
+ * SHORT-RANGE SCAN * |
+ ******************** |
+ |
+ MNEMONIC: SRSCAN |
+ SHORTEST ABBREVIATION: S |
+ FULL COMMANDS: SRSCAN |
+ SRSCAN NO |
+ |
+ THE SHORT-RANGE SCAN GIVES YOU A CONSIDERABLE AMOUNT OF |
+ INFORMATION ABOUT THE QUADRANT YOUR STARSHIP IS IN. A SHORT- |
+ RANGE SCAN IS BEST DESCRIBED BY AN EXAMPLE. |
+ |
+ 1 2 3 4 5 6 7 8 9 10 |
+ 1 * . . . . R . . . . STARDATE 2516.3 |
+ 2 . . . E . . . . . . CONDITION RED |
+ 3 . . . . . * . B . . POSITION 5 - 1, 2 - 4 |
+ 4 . . . S . . . . . . LIFE SUPPORT DAMAGED, RESERVES=2.3 |
+ 5 . . . . . . . K . . WARP FACTOR 5.0 |
+ 6 . K . @ . . . . * . ENERGY 2176.25 |
+ 7 . . . . . P . . . . TORPEDOES 3 |
+ 8 . . . . * . . . . . SHIELDS UP, 42 PERCENT 1050 UNITS |
+ 9 . * . . * . . . C . KLINGONS LEFT 12 |
+ 10 . . . . . . . . . . TIME LEFT 3.72 |
+ |
+ THE LEFT PART IS A PICTURE OF THE QUADRANT. THE E AT SECTOR |
+ 2 - 4 REPRESENTS THE ENTERPRISE; THE B AT SECTOR 3 - 8 IS A STARBASE. |
+ THERE ARE ORDINARY KLINGONS (K) AT SECTORS 5 - 8 AND 6 - 2, AND A |
+ KLINGON COMMANDER (C) AT 9 - 9. THE (GULP) "SUPER-COMMANDER" (S) |
+ OCCUPIES SECTOR 4 - 4, AND A ROMULAN (R) IS AT 1 - 6. A PLANET (P) |
+ IS AT SECTOR 7 - 6. THERE ARE ALSO A LARGE NUMBER OF STARS (*). |
+ THE PERIODS (.) ARE JUST EMPTY SPACE--THEY ARE PRINTED TO HELP |
+ YOU GET YOUR BEARINGS. SECTOR 6 - 4 CONTAINS A BLACK HOLE (@). |
+ |
+ THE INFORMATION ON THE RIGHT IS ASSORTED STATUS INFORMATION. |
+ THE STATUS INFORMATION WILL BE ABSENT IF YOU TYPE <NO> AFTER |
+ SRSCAN. OTHERWISE, STATUS INFORMATION WILL BE PRESENTED. |
+ |
+ SHORT-RANGE SCANS ARE FREE. THAT IS, THEY USE UP NO ENERGY |
+ AND NO TIME. IF YOU ARE IN BATTLE, DOING A SHORT-RANGE SCAN DOES |
+ NOT GIVE THE ENEMIES ANOTHER CHANCE TO HIT YOU. YOU CAN SAFELY |
+ DO A SHORT-RANGE SCAN ANYTIME YOU LIKE. |
+ |
+ STARBASES ALSO HAVE SHORT RANGE SENSORS. IF YOU ARE DOCKED |
+ AT A STARBASE AND YOUR SHORT RANGE SENSORS ARE DAMAGED, YOU |
+ MAY USE THE ONES AT THE STARBASE BY USING THE <SRSCAN> COMMAND. |
+ |
+ |
+ 6 |
+ |
+ ***************** |
+ * STATUS REPORT * |
+ ***************** |
+ |
+ MNEMONIC: STATUS |
+ SHORTEST ABBREVIATION: ST |
+ |
+ THIS COMMAND GIVES YOU INFORMATION ABOUT THE CURRENT STATE OF |
+ YOUR STARSHIP, AS FOLLOWS: |
+ |
+ STARDATE - THE CURRENT DATE. A STARDATE IS THE SAME AS A DAY. |
+ |
+ CONDITION - THERE ARE FOUR POSSIBLE CONDITIONS: |
+ DOCKED - DOCKED AT STARBASE. |
+ RED - IN BATTLE. |
+ YELLOW - LOW ON ENERGY ( < 1000 UNITS). |
+ GREEN - NONE OF THE ABOVE. |
+ |
+ POSITION - QUADRANT IS GIVEN FIRST, THEN SECTOR. |
+ |
+ LIFE SUPPORT - IF "ACTIVE", LIFE SUPPORT SYSTEMS ARE |
+ FUNCTIONING NORMALLY. IF ON "RESERVES", THE NUMBER |
+ IS HOW MANY STARDATES YOUR RESERVE FOOD, AIR, ETC. WILL |
+ LAST--YOU MUST GET REPAIRS MADE OR GET TO STARBASE |
+ BEFORE YOUR RESERVES RUN OUT. |
+ |
+ WARP FACTOR - WHAT YOUR WARP FACTOR IS CURRENTLY SET TO. |
+ |
+ ENERGY - THE AMOUNT OF ENERGY YOU HAVE LEFT. IF IT DROPS TO |
+ ZERO, YOU DIE. |
+ |
+ TORPEDOES - HOW MANY PHOTON TORPEDOES YOU HAVE LEFT. |
+ |
+ SHIELDS - WHETHER YOUR SHIELDS ARE UP OR DOWN, HOW STRONG |
+ THEY ARE (WHAT PERCENT OF A HIT THEY CAN DEFLECT), AND |
+ SHIELD ENERGY. |
+ |
+ KLINGONS LEFT - HOW MANY OF THE KLINGONS ARE STILL OUT THERE. |
+ |
+ TIME LEFT - HOW LONG THE FEDERATION CAN HOLD OUT AGAINST THE |
+ PRESENT NUMBER OF KLINGONS; THAT IS, HOW LONG UNTIL THE |
+ END IF YOU DO NOTHING IN THE MEANTIME. IF YOU KILL KLINGONS |
+ QUICKLY, THIS NUMBER WILL GO UP--IF NOT, IT WILL GO DOWN. |
+ IF IT REACHES ZERO, THE FEDERATION IS CONQUERED, AND YOU |
+ LOSE. |
+ |
+ STATUS INFORMATION IS FREE--IT USES NO TIME OR ENERGY, AND IF |
+ YOU ARE IN BATTLE, THE KLINGONS ARE NOT GIVEN ANOTHER CHANCE TO HIT |
+ YOU. |
+ |
+ STATUS INFORMATION CAN ALSO BE OBTAINED BY DOING A SHORT-RANGE |
+ SCAN. SEE THE <SRSCAN> COMMAND FOR DETAILS. |
+ |
+ EACH ITEM OF INFORMATION CAN BE OBTAINED SINGLY BY REQUESTING |
+ IT. SEE <REQUEST> COMMAND FOR DETAILS. |
+ |
+ 7 |
+ |
+ |
+ ******************* |
+ * LONG-RANGE SCAN * |
+ ******************* |
+ |
+ MNEMONIC: LRSCAN |
+ SHORTEST ABBREVIATION: L |
+ |
+ A LONG-RANGE SCAN GIVES YOU GENERAL INFORMATION ABOUT WHERE YOU |
+ ARE AND WHAT IS AROUND YOU. HERE IS AN EXAMPLE OUTPUT. |
+ |
+ L. R. SCAN FOR QUADRANT 5 - 1 |
+ -1 107 103 |
+ -1 316 5 |
+ -1 105 1000 |
+ |
+ THIS SCAN SAYS THAT YOU ARE IN ROW 5, COLUMN 1 OF THE 8 BY 8 |
+ GALAXY. THE NUMBERS IN THE SCAN INDICATE HOW MANY OF EACH |
+ KIND OF THING THERE IS IN YOUR QUADRANT AND ALL ADJACENT |
+ QUADRANTS. THE DIGITS ARE INTERPRETED AS FOLLOWS. |
+ |
+ THOUSANDS DIGIT: 1000 INDICATES A SUPERNOVA (ONLY) |
+ HUNDREDS DIGIT: NUMBER OF KLINGONS PRESENT |
+ TENS DIGIT: NUMBER OF STARBASES PRESENT |
+ ONES DIGIT: NUMBER OF STARS PRESENT |
+ |
+ FOR EXAMPLE, IN YOUR QUADRANT (5 - 1) THE NUMBER IS 316, WHICH |
+ INDICATES 3 KLINGONS, 1 STARBASE AND 6 STARS. (THE LONG-RANGE |
+ SCANNER DOES NOT DISTINGUISH BETWEEN ORDINARY KLINGONS AND |
+ KLINGON COMMAND SHIPS.) IF THERE IS A SUPERNOVA, AS IN THE |
+ QUADRANT BELOW AND TO YOUR RIGHT (QUADRANT 6 - 2), THERE IS |
+ NOTHING ELSE IN THE QUADRANT. |
+ |
+ ROMULANS POSSESS A "CLOAKING DEVICE" WHICH PREVENTS THEIR |
+ DETECTION BY LONG-RANGE SCAN. BECAUSE OF THIS FACT, STARFLEET |
+ COMMAND IS NEVER SURE HOW MANY ROMULANS ARE "OUT THERE". |
+ WHEN YOU KILL THE LAST KLINGON, THE REMAINING ROMULANS SURRENDER |
+ TO THE FEDERATION. |
+ |
+ PLANETS ARE ALSO UNDETECTABLE BY LONG-RANGE SCAN. THE |
+ ONLY WAY TO DETECT A PLANET IS TO FIND IT IN YOUR CURRENT |
+ QUADRANT WITH SHORT-RANGE SENSORS. |
+ |
+ SINCE YOU ARE IN COLUMN 1, THERE ARE NO QUADRANTS TO YOUR |
+ LEFT. THE MINUS ONES INDICATE THE NEGATIVE ENERGY BARRIER AT |
+ THE EDGE OF THE GALAXY, WHICH YOU ARE NOT PERMITTED TO CROSS. |
+ |
+ LONG-RANGE SCANS ARE FREE. THEY USE UP NO ENERGY OR TIME, |
+ AND CAN BE DONE SAFELY REGARDLESS OF BATTLE CONDITIONS. |
+ |
+ STARBASES ALSO HAVE L.R. SENSORS. IF YOU ARE DOCKED AND YOUR |
+ LONG-RANGE SENSORS ARE DAMAGED, YOU MAY USE THE ONES AT STARBASE |
+ BY USING THE <LRSCAN> COMMAND. |
+ |
+ 8 |
+ ************** |
+ * STAR CHART * |
+ ************** |
+ |
+ MNEMONIC: CHART |
+ SHORTEST ABBREVIATION: C |
+ |
+ AS YOU PROCEED IN THE GAME, YOU LEARN MORE AND MORE ABOUT |
+ WHAT THINGS ARE WHERE IN THE GALAXY. THIS INFORMATION IS |
+ AUTOMATICALLY RECORDED FOR YOU (BY SPOCK) IN YOUR STAR CHART. |
+ |
+ THE CHART LOOKS LIKE AN 8 BY 8 ARRAY OF NUMBERS. THESE |
+ NUMBERS ARE INTERPRETED EXACTLY AS THEY ARE ON A LONG-RANGE |
+ SCAN. A PERIOD (.) IN PLACE OF A DIGIT MEANS YOU DO NOT KNOW |
+ THAT INFORMATION YET. FOR EXAMPLE, ... MEANS YOU KNOW NOTHING |
+ ABOUT THE QUADRANT, WHILE .1. MEANS YOU KNOW THAT IT CONTAINS |
+ A BASE, BUT AN UNKNOWN NUMBER OF KLINGONS AND STARS. |
+ |
+ LOOKING AT THE STAR CHART IS A FREE OPERATION. IT COSTS |
+ YOU NEITHER TIME NOR ENERGY, AND CAN BE DONE SAFELY WHETHER |
+ IN OR OUT OF BATTLE. |
+ |
+ |
+ ***************** |
+ * DAMAGE REPORT * |
+ ***************** |
+ |
+ MNEMONIC: DAMAGES |
+ SHORTEST ABBREVIATION: DA |
+ |
+ AT ANY TIME YOU MAY ASK FOR A DAMAGE REPORT TO FIND OUT WHAT |
+ DEVICES ARE DAMAGED AND HOW LONG IT WILL TAKE TO REPAIR THEM. |
+ NATURALLY, REPAIRS PROCEED FASTER AT A STARBASE. |
+ |
+ IF YOU SUFFER DAMAGES WHILE MOVING, IT IS POSSIBLE THAT A |
+ SUBSEQUENT DAMAGE REPORT WILL NOT SHOW ANY DAMAGE. THIS HAPPENS |
+ IF THE TIME SPENT ON THE MOVE EXCEEDS THE REPAIR TIME, SINCE IN |
+ THIS CASE THE DAMAGED DEVICES WERE FIXED EN ROUTE. |
+ |
+ DAMAGE REPORTS ARE FREE. THEY USE NO ENERGY OR TIME, AND CAN |
+ BE DONE SAFELY EVEN IN THE MIDST OF BATTLE. |
+ |
+ |
+ ************************* |
+ * MOVE UNDER WARP DRIVE * |
+ ************************* |
+ |
+ MNEMONIC: MOVE |
+ SHORTEST ABBREVIATION: M |
+ FULL COMMAND: MOVE <MANUAL> <DISPLACEMENT> |
+ MOVE <AUTOMATIC> <DESTINATION> |
+ |
+ THIS COMMAND IS THE USUAL WAY TO MOVE FROM ONE PLACE TO |
+ ANOTHER WITHIN THE GALAXY. YOU MOVE UNDER WARP DRIVE, ACCORDING |
+ TO THE CURRENT WARP FACTOR (SEE "WARP FACTOR"). |
+ |
+ 9 |
+ THERE ARE TWO COMMAND MODES FOR MOVEMENT; MANUAL AND AUTOMATIC. |
+ THE MANUAL MODE IS DEFAULT, AND REQUIRES THE FOLLOWING FORMAT: |
+ |
+ MOVE <MANUAL> <DELTX> <DELTY> |
+ |
+ <MANUAL> IS OPTIONAL. IF OMITTED, MANUAL MOVEMENT IS ASSUMED. |
+ <DELTX> AND <DELTY> ARE THE HORIZONTAL AND VERTICAL DISPLACEMENTS FOR |
+ YOUR STARSHIP, IN QUADRANTS; A DISPLACEMENT OF ONE SECTOR IS 0.1 |
+ QUADRANTS. SPECIFYING <DELTX> AND <DELTY> CAUSES YOUR SHIP TO MOVE |
+ IN A STRAIGHT LINE TO THE SPECIFIED DESTINATION. FOR EXAMPLE, |
+ THE SHORTEST POSSIBLE COMMAND TO MOVE 1 SECTOR TO THE RIGHT WOULD BE |
+ |
+ M .1 0 |
+ |
+ THE FOLLOWING EXAMPLES OF MANUAL MOVEMENT REFER TO THE |
+ SHORT-RANGE SCAN ON PAGE 5. |
+ |
+ DESTINATION SECTOR MANUAL MOVEMENT COMMAND |
+ |
+ 3 - 1 M -.3 -.1 |
+ 2 - 1 M -.3 0 |
+ 1 - 2 M -.2 .1 |
+ 1 - 4 M 0 .1 |
+ (LEAVING QUADRANT) M 0 .2 |
+ 1 - 5 M .1 .1 |
+ 2 - 10 M .6 0 |
+ 5 - 6 M .2 -.3 |
+ 3 - 4 M 0 -.1 |
+ |
+ THE AUTOMATIC MODE IS AS FOLLOWS: |
+ |
+ MOVE <AUTOMATIC> <QROW> <QCOL> <SROW> <SCOL> |
+ |
+ WHERE <QROW> AND <QCOL> ARE THE ROW AND COLUMN NUMBERS OF THE |
+ DESTINATION QUADRANT, AND <SROW> AND <SCOL> ARE THE ROW AND |
+ COLUMN NUMBERS OF THE DESTINATION SECTOR WITHIN THAT QUADRANT. |
+ THIS COMMAND ALSO MOVES YOUR SHIP IN A STRAIGHT LINE PATH TO |
+ THE DESTINATION. <AUTOMATIC> (A IS SUFFICIENT) MUST BE PRESENT. |
+ FOR MOVING WITHIN A QUADRANT, <QROW> AND <QCOL> MAY BE OMITTED. |
+ FOR EXAMPLE, TO MOVE TO SECTOR 2 - 9 WITHIN THE CURRENT QUADRANT, |
+ THE SHORTEST COMMAND WOULD BE |
+ |
+ M A 2 9 |
+ |
+ TO MOVE TO QUADRANT 3 - 7, SECTOR 5 - 8, TYPE |
+ |
+ M A 3 7 5 8 |
+ |
+ AND IT WILL BE DONE. IN AUTOMATIC MODE, EITHER TWO OR FOUR NUMBERS |
+ MUST BE SUPPLIED. |
+ |
+ AUTOMATIC MODE UTILIZES THE SHIP'S "BATTLE COMPUTER". IF |
+ THE COMPUTER IS DAMAGED, MANUAL MOVEMENT MUST BE USED. |
+ |
+ 10 |
+ IT USES TIME AND ENERGY TO MOVE. HOW MUCH TIME AND HOW MUCH |
+ ENERGY DEPENDS ON YOUR CURRENT WARP FACTOR, THE DISTANCE YOU MOVE, |
+ AND WHETHER YOUR SHIELDS ARE UP. THE HIGHER THE WARP FACTOR, THE |
+ FASTER YOU MOVE, BUT HIGHER WARP FACTORS REQUIRE MORE ENERGY. |
+ YOU MAY MOVE WITH YOUR SHIELDS UP, BUT THIS DOUBLES THE ENERGY |
+ REQUIRED. |
+ |
+ EACH TIME YOU MOVE IN A QUADRANT CONTAINING KLINGONS, THEY |
+ HAVE A CHANCE TO ATTACK YOU. IN THIS CASE, THE "ENERGY LEFT" |
+ MESSAGE YOU GET REFERS TO YOUR ENERGY AFTER THE ATTACK BUT BEFORE |
+ THE MOVE. AS YOU MOVE, THE AMOUNT THAT THE KLINGONS HIT YOU WITH |
+ IS DEPENDENT ON YOUR AVERAGE DISTANCE FROM THEM. |
+ |
+ *************** |
+ * WARP FACTOR * |
+ *************** |
+ |
+ MNEMONIC: WARP |
+ SHORTEST ABBREVIATION: W |
+ FULL COMMAND: WARP <NUMBER> |
+ |
+ YOUR WARP FACTOR CONTROLS THE SPEED OF YOUR STARSHIP. THE |
+ LARGER THE WARP FACTOR, THE FASTER YOU GO AND THE MORE ENERGY |
+ YOU USE. |
+ |
+ YOUR MINIMUM WARP FACTOR IS 1.0 AND YOUR MAXIMUM WARP FACTOR |
+ IS 10.0 (WHICH IS 100 TIMES AS FAST AND USES 1000 TIMES AS MUCH |
+ ENERGY). AT SPEEDS ABOVE WARP 6 THERE IS SOME DANGER OF CAUSING |
+ DAMAGE TO YOUR WARP ENGINES; THIS DAMAGE IS LARGER AT HIGHER |
+ WARP FACTORS AND ALSO DEPENDS ON HOW FAR YOU GO AT THAT WARP |
+ FACTOR. |
+ |
+ AT EXACTLY WARP 10 THERE IS SOME PROBABILITY OF ENTERING A |
+ SO-CALLED "TIME WARP" AND BEING THROWN FORWARD OR BACKWARD IN |
+ TIME. THE FARTHER YOU GO AT WARP 10, THE GREATER IS THE PROBABILITY |
+ OF ENTERING THE TIME WARP. |
+ |
+ ******************* |
+ * IMPULSE ENGINES * |
+ ******************* |
+ |
+ MNEMONIC: IMPULSE |
+ SHORTEST ABBREVIATION: I |
+ FULL COMMAND: IMPULSE <MANUAL OR AUTOMATIC> <DISPLACEMENT OR DESTINATION> |
+ |
+ THE IMPULSE ENGINES GIVE YOU A WAY TO MOVE WHEN YOUR WARP |
+ ENGINES ARE DAMAGED. THEY MOVE YOU AT A SPEED OF 0.95 SECTORS |
+ PER STARDATE, WHICH IS THE EQUIVALENT OF A WARP FACTOR OF ABOUT |
+ 0.975, SO THEY ARE MUCH TOO SLOW TO USE EXCEPT IN EMERGENCIES. |
+ |
+ MOVEMENT COMMANDS ARE INDICATED JUST AS IN THE "MOVE" COMMAND. |
+ |
+ THE IMPULSE ENGINES REQUIRE 20 UNITS OF ENERGY TO ENGAGE, |
+ PLUS 10 UNITS PER SECTOR (100 UNITS PER QUADRANT) TRAVELLED. |
+ IT DOES NOT COST EXTRA TO MOVE WITH THE SHIELDS UP. |
+ |
+ 11 |
+ ********************* |
+ * DEFLECTOR SHIELDS * |
+ ********************* |
+ |
+ MNEMONIC: SHIELDS |
+ SHORTEST ABBREVIATION: SH |
+ FULL COMMANDS: SHIELDS UP |
+ SHIELDS DOWN |
+ SHIELDS TRANSFER <AMOUNT OF ENERGY TO TRANSFER> |
+ |
+ YOUR DEFLECTOR SHIELDS ARE A DEFENSIVE DEVICE TO PROTECT YOU |
+ FROM KLINGON ATTACKS (AND NEARBY NOVAS). AS THE SHIELDS PROTECT |
+ YOU, THEY GRADUALLY WEAKEN. A SHIELD STRENGTH OF 75 PERCENT, FOR |
+ EXAMPLE, MEANS THAT THE NEXT TIME A KLINGON HITS YOU, YOUR SHIELDS |
+ WILL DEFLECT 75 PERCENT OF THE HIT, AND LET 25 PERCENT GET THROUGH |
+ TO HURT YOU. |
+ |
+ IT COSTS 50 UNITS OF ENERGY TO RAISE SHIELDS, NOTHING TO LOWER |
+ THEM. YOU MAY MOVE WITH YOUR SHIELDS UP; THIS COSTS NOTHING EXTRA |
+ UNDER IMPULSE POWER, BUT DOUBLES THE ENERGY REQUIRED FOR WARP DRIVE. |
+ |
+ EACH TIME YOU RAISE OR LOWER YOUR SHIELDS, THE KLINGONS HAVE |
+ ANOTHER CHANCE TO ATTACK. SINCE SHIELDS DO NOT RAISE AND LOWER |
+ INSTANTANEOUSLY, THE HITS YOU RECEIVE WILL BE INTERMEDIATE BETWEEN |
+ WHAT THEY WOULD BE IF THE SHIELDS WERE COMPLETELY UP OR COMPLETELY DOWN. |
+ |
+ YOU MAY NOT FIRE PHASERS THROUGH YOUR SHIELDS. HOWEVER, |
+ YOU MAY USE THE "HIGH-SPEED SHIELD CONTROL" TO LOWER SHIELDS, |
+ FIRE PHASERS, AND RAISE THE SHIELDS AGAIN BEFORE THE KLINGONS CAN |
+ REACT. SINCE RAPID LOWERING AND RAISING OF THE SHIELDS REQUIRES |
+ MORE ENERGY THAN NORMAL SPEED OPERATION, IT COSTS YOU 200 UNITS OF |
+ ENERGY TO ACTIVATE THIS CONTROL. IT IS AUTOMATICALLY ACTIVATED WHEN |
+ YOU FIRE PHASERS WHILE SHIELDS ARE UP. YOU MAY FIRE PHOTON TORPEDOES, |
+ BUT THEY MAY BE DEFLECTED CONSIDERABLY FROM THEIR INTENDED COURSE |
+ AS THEY PASS THROUGH THE SHIELDS (DEPENDING ON SHIELD STRENGTH). |
+ |
+ YOU MAY TRANSFER ENERGY BETWEEN THE SHIP'S ENERGY (GIVEN AS |
+ <ENERGY> IN STATUS) AND THE SHIELDS. <TRANSFER> MAY BE ABBREVIATED |
+ <T>. <AMOUNT OF ENERGY TO TRANSFER> IS THE NUMBER OF UNITS OF |
+ ENERGY YOU WISH TO TAKE FROM THE SHIP'S ENERGY AND PUT INTO THE |
+ SHIELDS. IF YOU SPECIFY A NEGATIVE NUMBER, ENERGY IS DRAINED |
+ FROM THE SHIELDS TO THE SHIP. TRANSFERRING ENERGY CONSTITUTES A |
+ TURN. IF YOU TRANSFER ENERGY TO THE SHIELDS WHILE UNDER ATTACK, |
+ THEY WILL BE AT THE NEW ENERGY LEVEL WHEN YOU ARE NEXT HIT. |
+ |
+ 12 |
+ *********** |
+ * PHASERS * |
+ *********** |
+ |
+ MNEMONIC: PHASERS |
+ SHORTEST ABBREVIATION: P |
+ FULL COMMANDS: PHASERS AUTOMATIC <AMOUNT TO FIRE> <NO> |
+ PHASERS <AMOUNT TO FIRE> <NO> |
+ PHASERS MANUAL <NO> <AMOUNT 1> <AMOUNT 2> ... <AMOUNT N> |
+ |
+ PHASERS ARE ENERGY WEAPONS. AS YOU FIRE PHASERS AT KLINGONS, |
+ YOU SPECIFY AN <AMOUNT TO FIRE> WHICH IS DRAWN FROM YOUR ENERGY |
+ RESERVES. THE AMOUNT OF TOTAL HIT REQUIRED TO KILL AN ENEMY IS |
+ PARTLY RANDOM, BUT ALSO DEPENDS ON SKILL LEVEL. |
+ |
+ THE AVERAGE HIT REQUIRED TO KILL AN ORDINARY KLINGON VARIES |
+ FROM 200 UNITS IN THE NOVICE GAME TO 250 UNITS IN THE EMERITUS |
+ GAME. COMMANDERS NORMALLY REQUIRE FROM 600 (NOVICE) TO 700 |
+ (EMERITUS). THE "SUPER-COMMANDER" REQUIRES FROM 875 (GOOD) |
+ TO 1000 (EMERITUS). ROMULANS REQUIRE AN AVERAGE OF 350 (NOVICE) |
+ TO 450 (EMERITUS). |
+ |
+ HITS ON ENEMIES ARE CUMULATIVE, AS LONG AS YOU DO NOT LEAVE |
+ THE QUADRANT. |
+ |
+ IN GENERAL, NOT ALL THAT YOU FIRE WILL REACH THE KLINGONS. |
+ THE FARTHER AWAY THEY ARE, THE LESS PHASER ENERGY WILL REACH THEM. |
+ IF A KLINGON IS ADJACENT TO YOU, HE WILL RECEIVE ABOUT 90 PERCENT |
+ OF THE PHASER ENERGY DIRECTED AT HIM; A KLINGON 5 SECTORS AWAY |
+ WILL RECEIVE ABOUT 60 PERCENT, AND A KLINGON 10 SECTORS AWAY WILL |
+ RECEIVE ABOUT 35 PERCENT. THERE IS SOME RANDOMNESS INVOLVED, SO |
+ THESE FIGURES ARE NOT EXACT. PHASERS HAVE NO EFFECT BEYOND THE |
+ BOUNDARIES OF THE QUADRANT YOU ARE IN. |
+ |
+ PHASERS MAY OVERHEAT (AND BE DAMAGED) IF YOU FIRE TOO LARGE |
+ A BURST AT ONCE. FIRING UP TO 1500 UNITS IS SAFE. FROM 1500 |
+ ON UP, THE PROBABILITY OF OVERHEAT INCREASES WITH THE AMOUNT FIRED. |
+ |
+ IF PHASER FIRING IS AUTOMATIC, THE COMPUTER DECIDES HOW TO |
+ DIVIDE UP YOUR <AMOUNT TO FIRE> AMONG THE KLINGONS PRESENT. IF |
+ PHASER FIRING IS MANUAL, YOU SPECIFY HOW MUCH ENERGY TO FIRE AT |
+ EACH KLINGON PRESENT (NEAREST FIRST), RATHER THAN JUST SPECIFYING |
+ A TOTAL AMOUNT. YOU CAN ABBREVIATE "MANUAL" AND "AUTOMATIC" TO |
+ ONE OR MORE LETTERS; IF YOU MENTION NEITHER, AUTOMATIC FIRING IS |
+ USUALLY ASSUMED. |
+ |
+ A SAFETY INTERLOCK PREVENTS PHASERS FROM BEING FIRED THROUGH |
+ THE SHIELDS. IF THIS WERE NOT SO, THE SHIELDS WOULD CONTAIN |
+ YOUR FIRE AND YOU WOULD FRY YOURSELF. HOWEVER, YOU MAY UTILIZE |
+ THE "HIGH-SPEED SHIELD CONTROL" TO DROP SHIELDS, FIRE PHASERS, |
+ AND RAISE SHIELDS BEFORE THE ENEMY CAN REACT. SINCE IT TAKES |
+ MORE ENERGY TO RAISE THE SHIELDS RAPIDLY AFTER A SHOT, IT COSTS |
+ YOU 200 UNITS OF ENERGY EACH TIME YOU ACTIVATE THIS CONTROL. IT |
+ IS AUTOMATICALLY ACTIVATED WHEN YOU FIRE PHASERS WHILE SHIELDS ARE UP. |
+ BY SPECIFYING THE <NO> OPTION, SHIELDS ARE NOT RAISED AFTER FIRING. |
+ |
+ PHASERS HAVE NO EFFECT ON STARBASES (WHICH ARE SHIELDED) OR |
+ ON STARS. |
+ |
+ 13 |
+ ******************** |
+ * PHOTON TORPEDOES * |
+ ******************** |
+ |
+ MNEMONIC: PHOTONS |
+ SHORTEST ABBREVIATION: PHO |
+ FULL COMMANDS: PHOTONS <NUMBER> <TARG1> <TARG2> <TARG3> |
+ |
+ PHOTON TORPEDOES ARE PROJECTILE WEAPONS--YOU EITHER HIT WHAT |
+ YOU AIM AT, OR YOU DON'T. THERE ARE NO "PARTIAL HITS". |
+ |
+ ONE PHOTON TORPEDO WILL USUALLY KILL ONE ORDINARY KLINGON, |
+ BUT IT USUALLY TAKES ABOUT TWO FOR A KLINGON COMMANDER. PHOTON |
+ TORPEDOES CAN ALSO BLOW UP STARS AND STARBASES, IF YOU AREN'T |
+ CAREFUL. |
+ |
+ YOU MAY FIRE PHOTON TORPEDOES SINGLY, OR IN BURSTS OF TWO |
+ OR THREE. EACH TORPEDO IS INDIVIDUALLY TARGETABLE. THE COMPUTER |
+ WILL PROMPT YOU, ASKING FOR THE TARGET SECTOR FOR EACH TORPEDO. |
+ ALTERNATELY, YOU MAY SPECIFY EACH TARGET IN THE COMMAND LINE. |
+ |
+ PHOTON TORPEDOES CANNOT BE AIMED PRECISELY--THERE IS ALWAYS |
+ SOME RANDOMNESS INVOLVED IN THE DIRECTION THEY GO. PHOTON |
+ TORPEDOES MAY BE FIRED WITH YOUR SHIELDS UP, BUT AS THEY PASS |
+ THROUGH THE SHIELDS THEY ARE RANDOMLY DEFLECTED FROM THEIR |
+ INTENDED COURSE EVEN MORE. |
+ |
+ PHOTON TORPEDOES ARE PROXIMITY-FUSED. THE CLOSER THEY |
+ EXPLODE TO THE ENEMY, THE MORE DAMAGE THEY DO. THERE IS A HIT |
+ "WINDOW" ABOUT 1 SECTOR WIDE. IF THE TORPEDO MISSES THE HIT |
+ WINDOW, IT DOES NOT EXPLODE AND THE ENEMY IS UNAFFECTED. |
+ PHOTON TORPEDOES ARE ONLY EFFECTIVE WITHIN THE QUADRANT. THEY |
+ HAVE NO EFFECT ON THINGS IN ADJACENT QUADRANTS. |
+ |
+ IF MORE THAN ONE TORPEDO IS FIRED AND ONLY ONE TARGET |
+ SECTOR IS SPECIFIED, ALL TORPEDOES ARE FIRED AT THAT SECTOR. |
+ FOR EXAMPLE, TO FIRE TWO TORPEDOES AT SECTOR 3 - 4, YOU TYPE |
+ |
+ PHO 2 3 4 (OR) PHO 2 3 4 3 4 |
+ |
+ TO FIRE TORPEDOES AT, CONSECUTIVELY, SECTORS 2 - 6, 1 - 10, |
+ AND 4 - 7, TYPE |
+ |
+ PHO 3 2 6 1 10 4 7 |
+ |
+ THERE IS NO RESTRICTION TO FIRE DIRECTLY AT A SECTOR. FOR |
+ EXAMPLE, YOU CAN ENTER |
+ |
+ PHO 1 3 2.5 |
+ |
+ TO AIM BETWEEN TWO SECTORS. HOWEVER, SECTOR NUMBERS MUST BE |
+ 1 TO 10 INCLUSIVE. |
+ |
+ 14 |
+ ******************** |
+ * DOCK AT STARBASE * |
+ ******************** |
+ |
+ MNEMONIC: DOCK |
+ SHORTEST ABBREVIATION: D |
+ |
+ YOU MAY DOCK YOUR STARSHIP WHENEVER YOU ARE IN ONE OF THE |
+ EIGHT SECTOR POSITIONS IMMEDIATELY ADJACENT TO A STARBASE. WHEN |
+ YOU DOCK, YOUR STARSHIP IS RESUPPLIED WITH ENERGY, SHIELD ENERGY |
+ PHOTON TORPEDOES, AND LIFE SUPPORT RESERVES. REPAIRS ALSO PROCEED |
+ FASTER AT STARBASE, SO IF SOME OF YOUR DEVICES ARE DAMAGED, |
+ YOU MAY WISH TO STAY AT BASE (BY USING THE "REST" COMMAND) |
+ UNTIL THEY ARE FIXED. IF YOUR SHIP HAS MORE THAN ITS NORMAL |
+ MAXIMUM ENERGY (WHICH CAN HAPPEN IF YOU'VE LOADED CRYSTALS) |
+ THE SHIP'S ENERGY IS NOT CHANGED. |
+ |
+ YOU MAY NOT DOCK WHILE IN STANDARD ORBIT AROUND A PLANET. |
+ |
+ STARBASES HAVE THEIR OWN DEFLECTOR SHIELDS, SO YOU ARE |
+ COMPLETELY SAFE FROM ATTACK WHILE DOCKED. YOU ARE ALSO SAFE |
+ FROM LONG-RANGE TRACTOR BEAMS. |
+ |
+ ******** |
+ * REST * |
+ ******** |
+ |
+ MNEMONIC: REST |
+ SHORTEST ABBREVIATION: R |
+ FULL COMMAND: REST <NUMBER OF STARDATES> |
+ |
+ THIS COMMAND SIMPLY ALLOWS THE SPECIFIED NUMBER OF STARDATES |
+ TO GO BY. THIS IS USEFUL IF YOU HAVE SUFFERED DAMAGES AND WISH |
+ TO WAIT UNTIL REPAIRS ARE MADE BEFORE YOU GO BACK INTO BATTLE. |
+ |
+ IT IS NOT GENERALLY ADVISABLE TO REST WHILE YOU ARE UNDER |
+ ATTACK BY KLINGONS. |
+ |
+ ************************** |
+ * CALL STARBASE FOR HELP * |
+ ************************** |
+ |
+ MNEMONIC: HELP |
+ (NO ABBREVIATION) |
+ |
+ WHEN YOU GET INTO SERIOUS TROUBLE, YOU MAY CALL STARBASE FOR |
+ HELP. STARBASES HAVE A DEVICE CALLED A "LONG-RANGE TRANSPORTER |
+ BEAM" WHICH THEY CAN USE TO TELEPORT YOU TO BASE. THIS WORKS BY |
+ DEMATERIALIZING YOUR STARSHIP AT ITS CURRENT POSITION AND (HOPEFULLY) |
+ RE-MATERIALIZING IT ADJACENT TO THE NEAREST STARBASE. TELEPORTATION |
+ IS INSTANTANEOUS, AND STARBASE SUPPLIES THE REQUIRED ENERGY--ALL YOU |
+ HAVE TO DO IS LET THEM KNOW (VIA SUBSPACE RADIO) THAT YOU NEED HELP. |
+ |
+ 15 |
+ THIS COMMAND SHOULD BE EMPLOYED ONLY WHEN ABSOLUTELY NECESSARY. |
+ IN THE FIRST PLACE, CALLING FOR HELP IS AN ADMISSION ON YOUR PART |
+ THAT YOU GOT YOURSELF INTO SOMETHING YOU CANNOT GET YOURSELF OUT |
+ OF, AND YOU ARE HEAVILY PENALIZED FOR THIS IN THE FINAL SCORING. |
+ SECONDLY, THE LONG-RANGE TRANSPORTER BEAM IS NOT RELIABLE--STARBASE |
+ CAN ALWAYS MANAGE TO DEMATERIALIZE YOUR STARSHIP, BUT (DEPENDING |
+ ON DISTANCE) MAY OR MAY NOT BE ABLE TO RE-MATERIALIZE YOU AGAIN. |
+ THE LONG-RANGE TRANSPORTER BEAM HAS NO ABSOLUTE MAXIMUM RANGE; |
+ IF YOU ARE IN THE SAME QUADRANT AS A STARBASE, YOU HAVE A GOOD |
+ CHANCE (ABOUT 90 PERCENT) OF RE-MATERIALIZING SUCCESSFULLY. |
+ YOUR CHANCES DROP TO ROUGHLY 50-50 AT JUST OVER 3 QUADRANTS. |
+ |
+ |
+ |
+ **************** |
+ * ABANDON SHIP * |
+ **************** |
+ |
+ MNEMONIC: ABANDON |
+ (NO ABBREVIATION) |
+ |
+ YOU MAY ABANDON THE ENTERPRISE IF NECESSARY. IF THERE IS |
+ STILL A STARBASE IN THE GALAXY, YOU WILL BE SENT THERE AND PUT |
+ IN CHARGE OF A WEAKER SHIP, THE FAERIE QUEENE. |
+ |
+ THE FAERIE QUEENE CANNOT BE ABANDONED. |
+ |
+ ***************** |
+ * SELF-DESTRUCT * |
+ ***************** |
+ |
+ MNEMONIC: DESTRUCT |
+ (NO ABBREVIATION) |
+ |
+ YOU MAY SELF-DESTRUCT, THUS KILLING YOURSELF AND ENDING THE |
+ GAME. IF THERE ARE NEARBY KLINGONS, YOU MAY TAKE A FEW OF THEM |
+ WITH YOU (THE MORE ENERGY YOU HAVE LEFT, THE BIGGER THE BANG). |
+ |
+ IN ORDER TO SELF-DESTRUCT YOU MUST REMEMBER THE PASSWORD YOU |
+ TYPED IN AT THE BEGINNING OF THE GAME. |
+ |
+ |
+ |
+ ****************************** |
+ * TERMINATE THE CURRENT GAME * |
+ ****************************** |
+ |
+ MNEMONIC: TERMINATE |
+ (NO ABBREVIATION) |
+ |
+ IMMEDIATELY CANCEL THE CURRENT GAME; NO CONCLUSION IS REACHED. |
+ YOU WILL BE GIVEN AN OPPORTUNITY TO START A NEW GAME OR TO LEAVE |
+ THE STAR TREK PROGRAM. |
+ |
+ 16 |
+ *************** |
+ * SENSOR-SCAN * |
+ *************** |
+ |
+ MNEMONIC: SENSORS |
+ SHORTEST ABBREVIATION: SE |
+ |
+ UTILIZING THE SHORT-RANGE SENSORS, SCIENCE OFFICER |
+ SPOCK GIVES YOU A READOUT ON ANY PLANET IN YOUR QUADRANT. |
+ PLANETS COME IN THREE CLASSES: M, N, AND O. ONLY CLASS M |
+ PLANETS HAVE EARTH-LIKE CONDITIONS. SPOCK INFORMS YOU IF THE |
+ PLANET HAS ANY DILITHIUM CRYSTALS. SENSOR SCANS ARE FREE. |
+ |
+ ************************ |
+ * ENTER STANDARD ORBIT * |
+ ************************ |
+ |
+ MNEMONIC: ORBIT |
+ SHORTEST ABBREVIATION: O |
+ |
+ TO LAND ON A PLANET YOU MUST FIRST BE IN STANDARD ORBIT. |
+ YOU ACHIEVE THIS IN A MANNER SIMILAR TO DOCKING AT STARBASE. |
+ MOVING TO ONE OF THE EIGHT SECTOR POSITIONS IMMEDIATELY ADJACENT |
+ TO THE PLANET, YOU GIVE THE ORBIT COMMAND WHICH PUTS YOUR SHIP |
+ INTO STANDARD ORBIT ABOUT THE PLANET. SINCE THIS IS A MANEUVER, |
+ A SMALL AMOUNT OF TIME IS USED; NEGLIGIBLE ENERGY IS REQUIRED. |
+ IF ENEMIES ARE PRESENT, THEY WILL ATTACK. |
+ |
+ ********************** |
+ * TRANSPORTER-TRAVEL * |
+ ********************** |
+ |
+ MNEMONIC: TRANSPORT |
+ SHORTEST ABBREVIATION: T |
+ |
+ THE TRANSPORTER IS A DEVICE WHICH CAN CONVERT ANY PHYSICAL |
+ OBJECT INTO ENERGY, BEAM THE ENERGY THROUGH SPACE, AND RECONSTRUCT |
+ THE PHYSICAL OBJECT AT SOME DESTINATION. TRANSPORTING IS ONE |
+ WAY TO LAND ON A PLANET. SINCE THE TRANSPORTER HAS A LIMITED |
+ RANGE, YOU MUST BE IN STANDARD ORBIT TO BEAM DOWN TO A PLANET. |
+ SHIELDS MUST BE DOWN WHILE TRANSPORTING. |
+ |
+ THE TRANSPORT COMMAND IS USED TO BEAM A LANDING PARTY ONTO |
+ A PLANET TO MINE "DILITHIUM CRYSTALS". EACH TIME THE COMMAND |
+ IS GIVEN THE LANDING PARTY (WHICH YOU LEAD) MOVES FROM THE SHIP |
+ TO THE PLANET, OR VICE-VERSA. |
+ |
+ YOU ARE ADVISED AGAINST NEEDLESS TRANSPORTING, SINCE LIKE |
+ ALL DEVICES, THE TRANSPORTER WILL SOMETIMES MALFUNCTION. |
+ |
+ THE TRANSPORTER CONSUMES NEGLIGIBLE TIME AND ENERGY. ITS |
+ USE DOES NOT CONSTITUTE A "TURN". |
+ |
+ 17 |
+ ***************** |
+ * SHUTTLE CRAFT * |
+ ***************** |
+ |
+ MNEMONIC: SHUTTLE |
+ SHORTEST ABBREVIATION: SHU |
+ |
+ AN ALTERNATE WAY TO TRAVEL TO AND FROM PLANETS. BECAUSE |
+ OF LIMITED RANGE, YOU MUST BE IN STANDARD ORBIT TO USE THE |
+ SHUTTLE CRAFT, NAMED "GALILEO". SHIELDS MUST BE DOWN. |
+ |
+ UNLIKE TRANSPORTING, USE OF THE SHUTTLE CRAFT DOES CONSTITUTE |
+ A "TURN" SINCE TIME IS CONSUMED. THE TIME NATURALLY DEPENDS |
+ ON ORBIT ALTITUDE, BUT WILL USUALLY BE LESS THAN 0.2 STARDATES. |
+ SHUTTLING USES NO SHIP ENERGY. |
+ |
+ *************************** |
+ * MINE DILITHIUM CRYSTALS * |
+ *************************** |
+ |
+ MNEMONIC: MINE |
+ SHORTEST ABBREVIATION: MI |
+ |
+ ONCE YOU AND YOUR MINING PARTY ARE ON THE SURFACE OF A |
+ PLANET WHICH HAS DILITHIUM CRYSTALS, THIS COMMAND WILL DIG THEM |
+ FOR YOU. |
+ |
+ MINING REQUIRES TIME AND CONSTITUTES A "TURN". NO ENERGY |
+ IS USED. CLASS M PLANETS REQUIRE 0.1 TO 0.3 STARDATES TO MINE. |
+ CLASS N PLANETS TAKE TWICE AS LONG, AND CLASS O PLANETS TAKE |
+ THREE TIMES AS LONG. |
+ |
+ DILITHIUM CRYSTALS CONTAIN ENORMOUS ENERGY IN A FORM |
+ THAT IS READILY RELEASED IN THE SHIP'S POWER SYSTEM. IT |
+ IS AN EXCELLENT IDEA TO MINE THEM WHENEVER POSSIBLE, FOR USE |
+ IN EMERGENCIES. ONCE YOU HAVE MINED CRYSTALS, AND HAVE THEM |
+ SAFELY ABOARD SHIP, YOU HAVE A SUPPLY THAT WILL LAST THE ENTIRE |
+ GAME. THERE IS NO NEED TO GO BACK FOR MORE (UNLESS YOU ABANDON |
+ SHIP). |
+ |
+ *************************** |
+ * LOAD DILITHIUM CRYSTALS * |
+ *************************** |
+ |
+ MNEMONIC: CRYSTALS |
+ SHORTEST ABBREVIATION: CR |
+ |
+ THIS IS A VERY POWERFUL COMMAND WHICH SHOULD BE USED WITH |
+ CAUTION. ONCE YOU HAVE DILITHIUM CRYSTALS ABOARD SHIP, THIS |
+ COMMAND WILL INSTRUCT ENGINEERING OFFICER SCOTT AND MR. SPOCK |
+ TO PLACE A RAW DILITHIUM CRYSTAL INTO THE POWER CHANNEL OF THE |
+ SHIP'S MATTER-ANTIMATTER CONVERTER. WHEN IT WORKS, THIS COMMAND |
+ WILL GREATLY BOOST THE SHIP'S ENERGY. |
+ |
+ 18 |
+ BECAUSE THE CRYSTALS ARE RAW AND IMPURE, INSTABILITIES |
+ CAN OCCUR IN THE POWER CHANNEL. USUALLY SCOTTY CAN CONTROL |
+ THESE. WHEN HE CANNOT, THE RESULTS ARE DISASTROUS. |
+ |
+ EVEN IF THE CRYSTALS ARE LOADED SUCCESSFULLY, SOME DAMAGE |
+ IS INEVITABLY DONE TO THE POWER CHANNEL. THIS DAMAGE HAS NO |
+ EFFECT ON THE OPERATION OF THE POWER PLANT, BUT WILL MAKE IT MORE |
+ DIFFICULT TO CONTROL INSTABILITIES THE NEXT TIME CRYSTALS ARE |
+ LOADED. |
+ |
+ SINCE USING RAW DILITHIUM CRYSTALS FOR THIS PURPOSE ENTAILS |
+ CONSIDERABLE RISK, STARFLEET REGULATIONS ALLOW ITS USE ONLY DURING |
+ "CONDITION YELLOW". NO TIME OR ENERGY IS USED. |
+ |
+ ***************** |
+ * PLANET REPORT * |
+ ***************** |
+ |
+ MNEMONIC: PLANETS |
+ SHORTEST ABBREVIATION: PL |
+ |
+ MR. SPOCK PRESENTS YOU A LIST OF THE AVAILABLE INFORMATION |
+ ON PLANETS IN THE GALAXY. SINCE PLANETS DO NOT SHOW UP ON |
+ LONG-RANGE SCANS, THE ONLY WAY TO OBTAIN THIS INFORMATION IS |
+ WITH THE "SENSORS" COMMAND. |
+ |
+ ********** |
+ * FREEZE * |
+ ********** |
+ |
+ MNEMONIC: FREEZE |
+ (NO ABBREVIATION) |
+ FULL COMMAND: FREEZE <FILE NAME> |
+ |
+ THE PURPOSE OF THE <FREEZE> COMMAND IS TO ALLOW A PLAYER |
+ TO SAVE THE CURRENT STATE OF THE GAME, SO THAT IT CAN BE FINISHED |
+ LATER. A FILE WITH THE SPECIFIED <FILE NAME> AND TYPE '.TRK' IS |
+ CREATED (IF NECESSARY) IN THE CURRENT DIRECTORY, AND ALL PERTINENT |
+ INFORMATION ABOUT THE GAME IS WRITTEN TO THAT FILE. THE GAME |
+ IS THEN TERMINATED, AND YOU ARE GIVEN THE CHOICE OF STARTING A NEW |
+ GAME OR LEAVING THE PROGRAM. YOU MAY CONTINUE THE CURRENT GAME |
+ USING THE PROCEDURE DESCRIBED NEXT. |
+ |
+ TO RESTART A GAME CREATED BY THE "FREEZE" COMMAND, THE USER |
+ NEED ONLY TYPE "FROZEN" IN RESPONSE TO THE INITIAL QUESTION |
+ ABOUT THE TYPE OF GAME DESIRED, FOLLOWED BY THE <FILE NAME>. |
+ |
+ NOTE: A "TOURNAMENT" GAME IS LIKE A FROZEN GAME, WITH THE |
+ FOLLOWING DIFFERENCES. (1) TOURNAMENT GAMES ALWAYS START FROM |
+ THE BEGINNING, WHILE A FROZEN GAME CAN START AT ANY POINT. |
+ (2) TOURNAMENT GAMES REQUIRE ONLY THAT THE PLAYER REMEMBER THE |
+ NAME OR NUMBER OF THE TOURNAMENT, WHILE THE INFORMATION ABOUT A |
+ FROZEN GAME MUST BE KEPT ON A FILE. |
+ |
+ A POINT WORTH NOTING IS THAT 'FREEZE' DOES NOT SAVE THE SEED |
+ FOR THE RANDOM NUMBER GENERATOR, SO THAT IDENTICAL ACTIONS AFTER |
+ RESTARTING THE SAME FROZEN GAME CAN LEAD TO DIFFERENT RESULTS. |
+ HOWEVER, IDENTICAL ACTIONS AFTER STARTING A GIVEN TOURNAMENT |
+ GAME ALWAYS LEAD TO THE SAME RESULTS. |
+ |
+ 19 |
+ *********** |
+ * REQUEST * |
+ *********** |
+ |
+ MNEMONIC: REQUEST |
+ SHORTEST ABBREVIATION: REQ |
+ FULL COMMAND: REQUEST <ITEM> |
+ |
+ THIS COMMAND ALLOWS YOU TO GET ANY SINGLE PIECE OF INFORMATION |
+ FROM THE <STATUS> COMMAND. <ITEM> SPECIFIES WHICH INFORMATION AS FOLLOWS: |
+ |
+ INFORMATION MNEMONIC FOR <ITEM> SHORTEST ABBREVIATION |
+ |
+ STARDATE DATE D |
+ CONDITION CONDITION C |
+ POSITION POSITION P |
+ LIFE SUPPORT LSUPPORT L |
+ WARP FACTOR WARPFACTOR W |
+ ENERGY ENERGY E |
+ TORPEDOES TORPEDOES TO |
+ SHIELDS SHIELDS S |
+ KLINGONS LEFT KLINGONS K |
+ TIME LEFT TIME T |
+ |
+ ************************** |
+ * EXPERIMENTAL DEATH RAY * |
+ ************************** |
+ |
+ MNEMONIC: DEATHRAY |
+ (NO ABBREVIATION) |
+ |
+ THIS COMMAND SHOULD BE USED ONLY IN THOSE DESPERATE CASES |
+ WHERE YOU HAVE ABSOLUTELY NO ALTERNATIVE. THE DEATH RAY USES |
+ ENERGY TO REARRANGE MATTER. UNFORTUNATELY, ITS WORKING PRINCIPLES |
+ ARE NOT YET THOROUGHLY UNDERSTOOD, AND THE RESULTS ARE HIGHLY |
+ UNPREDICTABLE. |
+ |
+ THE DEATH RAY IS A VERY DELICATE DEVICE AND IS USUALLY DAMAGED |
+ AFTER ITS FIRST USE. THE FIRST TIME ONE USES THE DEATH RAY, THERE |
+ IS A SEVENTY PERCENT CHANCE OF ITS FUNCTIONING CORRECTLY. WHEN IT |
+ WORKS, THE DEATH RAY ELIMINATES ALL THE ENEMIES IN THE QUADRANT. |
+ WHEN IT DOES NOT..................... |
+ |
+ IF THE DEATH RAY IS DAMAGED IN ITS USE, IT MUST BE TOTALLY |
+ REPLACED. THIS CAN ONLY BE DONE AT STARBASE. BECAUSE IT IS A VERY |
+ COMPLEX DEVICE, IT TAKES 9.99 STARDATES AT BASE TO REPLACE THE |
+ DEATH RAY. |
+ |
+ THE DEATH RAY CANNOT BE REPAIRED IN FLIGHT. |
+ |
+ 20 |
+ ****************** |
+ * EMERGENCY EXIT * |
+ ****************** |
+ |
+ MNEMONIC: EMEXIT |
+ SHORTEST ABBREVIATION: E |
+ |
+ THIS COMMAND PROVIDES A QUICK WAY TO EXIT FROM THE GAME WHEN |
+ YOU OBSERVE A KLINGON BATTLE CRUISER APPROACHING YOUR TERMINAL. |
+ ITS EFFECT IS TO FREEZE THE GAME ON THE FILE 'EMSAVE.TRK' IN YOUR |
+ CURRENT DIRECTORY, ERASE THE SCREEN (IF YOU ARE PLAYING AT A VT52), |
+ AND EXIT. |
+ |
+ A SHORT IMPLEMENTATION NOTE: THE SCREEN ERASURE IS DONE BY THE |
+ MODULE 'GETOUT', WHICH CAN EASILY BE MODIFIED TO HANDLE TERMINALS |
+ THAT USE DIFFERENT CONTROL OR ESCAPE SEQUENCES TO EFFECT SCREEN |
+ ERASURE. |
+ |
+ *************** |
+ * GAME REPORT * |
+ *************** |
+ |
+ MNEMONIC: GAME |
+ SHORTEST ABBREVIATION: G |
+ |
+ THIS COMMAND SUPPLIES YOU WITH INFORMATION ABOUT THE STATE OF THE |
+ CURRENT GAME. ITS PURPOSE IS TO REMIND YOU OF THINGS THAT YOU HAVE |
+ LEARNED DURING PLAY, BUT MAY HAVE FORGOTTEN, AND CANNOT OTHERWISE |
+ RETRIEVE IF YOU ARE NOT PLAYING AT A HARD-COPY TERMINAL. |
+ |
+ YOU ARE TOLD THE FOLLOWING THINGS: |
+ |
+ . THE LENGTH AND SKILL LEVEL OF THE GAME YOU ARE PLAYING |
+ . THE ORIGINAL NUMBER OF KLINGONS |
+ . HOW MANY KLINGONS YOU HAVE DESTROYED |
+ . WHETHER THE SUPER-COMMANDER HAS BEEN DESTROYED |
+ . HOW MANY BASES HAVE BEEN DESTROYED |
+ . HOW MANY BASES ARE LEFT |
+ . WHAT BASES (IF ANY) ARE UNDER ATTACK; YOU MUST HAVE BEEN |
+ INFORMED OF THE ATTACK VIA SUBSPACE RADIO |
+ . HOW MANY CASUALTIES YOU HAVE SUFFERED |
+ . HOW MANY TIMES YOU HAVE CALLED FOR HELP. |
+ |
+ YOU ARE ALSO WARNED IF THE SUBSPACE RADIO HAS BEEN DAMAGED, WHICH |
+ MAY RENDER YOUR INFORMATION INCOMPLETE. |
+ |
+ THIS SAME INFORMATION IS AUTOMATICALLY GIVEN TO YOU WHEN YOU |
+ START TO PLAY A FROZEN GAME. |
+ |
+ 21 |
+ ----------MISCELLANEOUS NOTES---------- |
+ |
+ STARBASES CAN BE ATTACKED BY EITHER COMMANDERS OR BY THE |
+ "SUPER-COMMANDER". WHEN THIS HAPPENS, YOU WILL BE NOTIFIED |
+ BY SUBSPACE RADIO, PROVIDED IT IS WORKING. THE MESSAGE WILL |
+ INFORM YOU HOW LONG THE BASE UNDER ATTACK CAN LAST. SINCE THE |
+ "SUPER-COMMANDER" IS MORE POWERFUL THAN AN ORDINARY COMMANDER, |
+ HE CAN DESTROY A BASE MORE QUICKLY. |
+ |
+ THE "SUPER-COMMANDER" TRAVELS AROUND THE GALAXY AT A SPEED |
+ OF ABOUT WARP 6 OR 7. HIS MOVEMENT IS STRICTLY TIME BASED; THE |
+ MORE TIME PASSES, THE FURTHER HE CAN GO. |
+ |
+ SCATTERED THROUGH THE GALAXY ARE CERTAIN ZONES OF CONTROL, |
+ COLLECTIVELY DESIGNATED THE "ROMULAN NEUTRAL ZONE". ANY |
+ QUADRANT WHICH CONTAINS ROMULANS WITHOUT KLINGONS IS PART OF THE |
+ NEUTRAL ZONE, EXCEPT IF A BASE IS PRESENT. SINCE ROMULANS DO NOT |
+ SHOW ON EITHER THE LONG-RANGE SCAN OR THE STAR CHART, IT IS EASY |
+ FOR YOU TO STUMBLE INTO THIS ZONE. WHEN YOU DO, IF YOUR SUBSPACE |
+ RADIO IS WORKING, YOU WILL RECEIVE A WARNING MESSAGE FROM THE |
+ ROMULAN, POLITELY ASKING YOU TO LEAVE. |
+ |
+ IN GENERAL, ROMULANS ARE A GALACTIC NUISANCE. |
+ |
+ THE HIGH-SPEED SHIELD CONTROL IS FAIRLY RELIABLE, BUT IT HAS |
+ BEEN KNOWN TO MALFUNCTION. |
+ |
+ YOU CAN OBSERVE THE GALACTIC MOVEMENTS OF THE "SUPER-COMMANDER" |
+ ON THE STAR CHART, PROVIDED HE IS IN TERRITORY YOU HAVE SCANNED. |
+ |
+ PERIODICALLY, YOU WILL RECEIVE INTELLIGENCE REPORTS FROM |
+ STARFLEET COMMAND, INDICATING THE CURRENT QUADRANT OF THE |
+ "SUPER-COMMANDER". YOUR SUBSPACE RADIO MUST BE WORKING, OF |
+ COURSE. |
+ |
+ EACH QUADRANT WILL CONTAIN FROM 0 TO 3 BLACK HOLES. |
+ TORPEDOES ENTERING A BLACK HOLE DISAPPEAR. IN FACT, ANYTHING |
+ ENTERING A BLACK HOLE DISAPPEARS, PERMANENTLY. IF YOU CAN DISPLACE |
+ AN ENEMY INTO ONE, HE IS A GONER. BLACK HOLES DO NOT NECESSARILY |
+ REMAIN IN A QUADRANT. THEY ARE TRANSIENT PHENOMENA. |
+ |
+ BATTLE COMPUTER INFORMATION IS AVAILABLE BY FIRING PHASERS |
+ MANUALLY, AND ALLOWING THE COMPUTER TO PROMPT YOU. IF YOU ENTER |
+ ZERO FOR THE AMOUNT TO FIRE AT EACH ENEMY, YOU WILL GET A |
+ COMPLETE REPORT, WITHOUT COST. THE BATTLE COMPUTER WILL TELL YOU HOW |
+ MUCH PHASER ENERGY TO FIRE AT EACH ENEMY FOR A SURE KILL. THIS |
+ INFO APPEARS IN PARENTHESES PRIOR TO THE PROMPT FOR EACH ENEMY. |
+ SINCE THE AMOUNT IS COMPUTED FROM SENSOR DATA, IF EITHER THE COMPUTER |
+ OR S.R. SENSORS ARE DAMAGED, THIS INFO WILL BE UNAVAILABLE, AND |
+ PHASERS MUST BE FIRED MANUALLY. BATTLE COMPUTER INFORMATION CAN BE |
+ OBTAINED EVEN IF THE PHASERS ARE DAMAGED (OR OTHERWISE UNUSABLE), |
+ PROVIDED THE COMPUTER AND SHORT-RANGE SENSORS ARE BOTH WORKING. |
+ |
+ IF WARP ENGINES ARE DAMAGED LESS THAN 10 STARDATES (UNDOCKED) |
+ YOU CAN STILL GO WARP 4. |
+ |
+ 22 |
+ |
+ ----------SCORING---------- |
+ |
+ |
+ SCORING IS FAIRLY SIMPLE. YOU GET POINTS FOR GOOD THINGS, AND |
+ YOU LOSE POINTS FOR BAD THINGS. |
+ |
+ YOU GAIN-- |
+ |
+ (1) 10 POINTS FOR EACH ORDINARY KLINGON YOU KILL, |
+ (2) 50 POINTS FOR EACH COMMANDER YOU KILL, |
+ (3) 200 POINTS FOR KILLING THE "SUPER-COMMANDER", |
+ (4) 20 POINTS FOR EACH ROMULAN KILLED, |
+ (5) 1 POINT FOR EACH ROMULAN CAPTURED. |
+ (6) 500 TIMES YOUR AVERAGE KLINGON/STARDATE KILL RATE. IF YOU |
+ LOSE THE GAME, YOUR KILL RATE IS BASED ON A MINIMUM OF |
+ 5 STARDATES. |
+ (7) YOU GET A BONUS IF YOU WIN THE GAME, BASED ON YOUR RATING: |
+ NOVICE=100, FAIR=200, GOOD=300, EXPERT=400, EMERITUS=500. |
+ |
+ YOU LOSE-- |
+ |
+ (8) 200 POINTS IF YOU GET YOURSELF KILLED, |
+ (9) 100 POINTS FOR EACH STARBASE YOU DESTROY, |
+ (10) 100 POINTS FOR EACH STARSHIP YOU LOSE, |
+ (11) 45 POINTS FOR EACH TIME YOU HAD TO CALL FOR HELP, |
+ (12) 10 POINTS FOR EACH PLANET YOU DESTROYED, |
+ (13) 5 POINTS FOR EACH STAR YOU DESTROYED, AND |
+ (14) 1 POINT FOR EACH CASUALTY YOU INCURRED. |
+ |
+ IN ADDITION TO YOUR SCORE, YOU MAY ALSO BE PROMOTED ONE GRADE |
+ IN RANK IF YOU PLAY WELL ENOUGH. PROMOTION IS BASED PRIMARILY ON |
+ YOUR KLINGON/STARDATE KILL RATE, SINCE THIS IS THE BEST INDICATOR |
+ OF WHETHER YOU ARE READY TO GO ON TO THE NEXT HIGHER RATING. |
+ HOWEVER, IF YOU HAVE LOST 100 OR MORE POINTS IN PENALTIES, YOU |
+ WILL NOT RECEIVE A PROMOTION. |
+ |
+ YOU CAN BE PROMOTED FROM ANY LEVEL. THERE IS A SPECIAL PROMOTION |
+ AVAILABLE IF YOU GO BEYOND THE "EXPERT" RANGE. YOU CAN ALSO HAVE |
+ A CERTIFICATE OF MERIT PRINTED WITH YOUR NAME, DATE, AND |
+ KLINGON KILL RATE, PROVIDED YOU ARE PROMOTED FROM EITHER THE |
+ "EXPERT" OR "EMERITUS" LEVELS. |
+ |
+ YOU SHOULD PROBABLY START OUT AT THE NOVICE LEVEL, EVEN IF YOU |
+ ARE ALREADY FAMILIAR WITH ONE OF THE OTHER VERSIONS OF THE STAR TREK |
+ GAME--BUT, OF COURSE, THE LEVEL OF GAME YOU PLAY IS UP TO YOU. IF |
+ YOU WANT TO START AT THE EXPERT LEVEL, GO AHEAD. IT'S YOUR FUNERAL. |
+ THE EMERITUS GAME IS STRICTLY FOR MASOCHISTS. |
+ |
+ 23 |
+ |
+ ----------MODIFICATIONS---------- |
+ |
+ |
+ THE STAR TREK GAME IS SUPPORTED BY THE AUTHORS. FROM TIME TO |
+ TIME, CORRECTIONS, MODIFICATIONS AND IMPROVEMENTS WILL BE MADE IN |
+ THE GAME. THE DOCUMENTATION FOR THE GAME (WHICH YOU ARE READING |
+ NOW) IS KEPT UP TO DATE, AND THE LATEST VERSION OF THE DOCUMENTATION |
+ IS AVAILABLE BY EXECUTING THE CONTROL CARDS: |
+ |
+ EXECPF 1234 GAMES. |
+ AND ENTERING "TRKINST" AS YOUR GAME. |
+ |
+ PLAYERS WHO ALREADY HAVE A COPY OF THE DOCUMENTATION CAN KEEP |
+ ABREAST OF THE NEW MODIFICATIONS BY EXECUTING THE CONTROL CARDS: |
+ |
+ EXECPF 1234 GAMES. |
+ AND ENTERING "TRKNEWS" AS YOUR GAME. |
+ |
+ CORRECTIONS AND MINOR MODIFICATIONS (THOSE WHICH HAVE LITTLE EFFECT |
+ ON THE GAME) WILL NOT IN GENERAL BE REPORTED. |
+ |
+ CAVEAT: SINCE THE GAME IS CONTINUALLY BEING IMPROVED, IT IS |
+ POSSIBLE THAT NEW REVISIONS WILL ALTER THE NATURE OF TOURNAMENT |
+ GAMES OR WILL RENDER PREVIOUSLY FROZEN GAMES UNPLAYABLE. THE |
+ AUTHORS WILL ATTEMPT TO AVOID SUCH OCCURRANCES WHEREVER POSSIBLE |
+ AND TO MINIMIZE THE EFFECTS WHEN THEY DO OCCUR, BUT CANNOT MAKE |
+ ANY GUARANTEES. |
+ |
+ 24 |
+ ----------HANDY REFERENCE PAGE---------- |
+ |
+ ABBREV FULL COMMAND DEVICE USED |
+ ------ ------------ ----------- |
+ ABANDON ABANDON SHUTTLE CRAFT |
+ C CHART (NONE) |
+ CR CRYSTALS (NONE) |
+ DA DAMAGES (NONE) |
+ DEATHRAY DEATHRAY DEATHRAY |
+ DESTRUCT DESTRUCT COMPUTER |
+ D DOCK (NONE) |
+ E EMEXIT (NONE) |
+ FREEZE FREEZE <FILE NAME> (NONE) |
+ G GAME (NONE) |
+ HELP HELP SUBSPACE RADIO |
+ I IMPULSE <MANUAL> <DISPLACEMENT> IMPULSE ENGINES |
+ IMPULSE <AUTOMATIC> <DESTINATION> IMPULSE ENGINES AND COMPUTER |
+ L LRSCAN LONG-RANGE SENSORS |
+ MI MINE (NONE) |
+ M MOVE <MANUAL> <DISPLACEMENT> WARP ENGINES |
+ MOVE <AUTOMATIC> <DESTINATION> WARP ENGINES AND COMPUTER |
+ O ORBIT WARP OR IMPULSE ENGINES |
+ P PHASERS <TOTAL AMOUNT> PHASERS AND COMPUTER |
+ PHASERS AUTOMATIC <TOTAL AMOUNT> PHASERS, COMPUTER, SR SENSORS |
+ PHASERS MANUAL <AMT1> <AMT2> ... PHASERS |
+ PHO PHOTONS <NUMBER> <TARGETS> TORPEDO TUBES |
+ PL PLANETS (NONE) |
+ REQ REQUEST (NONE) |
+ R REST <NUMBER OF STARDATES> (NONE) |
+ SE SENSORS SHORT-RANGE SENSORS |
+ SH SHIELDS <UP, DOWN, OR TRANSFER> DEFLECTOR SHIELDS |
+ SHU SHUTTLE SHUTTLE CRAFT |
+ S SRSCAN <YES OR NO> SHORT-RANGE SENSORS |
+ ST STATUS (NONE) |
+ TERMINATE TERMINATE (NONE) |
+ T TRANSPORT TRANSPORTER |
+ W WARP <FACTOR> (NONE) |
+ L. R. SCAN: THOUSANDS DIGIT: SUPERNOVA |
+ HUNDREDS DIGIT: KLINGONS |
+ TENS DIGIT: STARBASES |
+ ONES DIGIT: STARS |
+ PERIOD (.): DIGIT NOT KNOWN (STAR CHART ONLY) |
+ |
+ COURSES ARE GIVEN IN MANUAL MODE IN X - Y DISPLACEMENTS; IN AUTOMATIC |
+ MODE AS DESTINATION QUADRANT AND/OR SECTOR. MANUAL MODE IS DEFAULT. |
+ DISTANCES ARE GIVEN IN QUADRANTS. A DISTANCE OF ONE SECTOR IS 0.1 QUADRANT. |
+ ORDINARY KLINGONS HAVE ABOUT 400 UNITS OF ENERGY, COMMANDERS ABOUT |
+ 1200. ROMULANS NORMALLY HAVE ABOUT 800 UNITS OF ENERGY, AND THE |
+ (GULP) "SUPER-COMMANDER" HAS ABOUT 1800. |
+ PHASER FIRE DIMINISHES TO ABOUT 60 PERCENT AT 5 SECTORS. UP TO 1500 |
+ UNITS MAY BE FIRED IN A SINGLE BURST WITHOUT DANGER OF OVERHEAT. |
+ WARP 6 IS THE FASTEST SAFE SPEED. AT HIGHER SPEEDS, ENGINE DAMAGE |
+ MAY OCCUR. AT WARP 10 YOU MAY ENTER A TIME WARP. |
+ SHIELDS COST 50 UNITS OF ENERGY TO RAISE, AND DOUBLE THE POWER |
+ REQUIREMENTS OF MOVING UNDER WARP DRIVE. ENGAGING THE HIGH-SPEED |
+ SHIELD CONTROL REQUIRES 200 UNITS OF ENERGY. |
+ WARP DRIVE REQUIRES (DISTANCE)*(WARP FACTOR CUBED) UNITS OF ENERGY |
+ TO TRAVEL AT A SPEED OF (WARP FACTOR SQUARED)/10 QUADRANTS PER STARDATE. |
+ IMPULSE ENGINES REQUIRE 20 UNITS TO WARM UP, PLUS 100 UNITS PER |
+ QUADRANT. SPEED IS JUST UNDER ONE SECTOR PER STARDATE. |
+ |
+ 25 |
+ ----------ACKNOWLEDGMENTS---------- |
+ |
+ |
+ THE AUTHORS WOULD LIKE TO THANK PROFESSOR MICHAEL DUGGAN FOR |
+ HIS ENCOURAGEMENT AND ADMINISTRATIVE ASSISTANCE WITH THE DEVELOPMENT |
+ OF THE STAR TREK GAME, WITHOUT WHICH IT MIGHT NEVER HAVE BEEN |
+ COMPLETED. |
+ |
+ MUCH CREDIT IS DUE TO PATRICK MCGEHEARTY AND RICH COHEN, WHO |
+ ASSISTED WITH THE ORIGINAL DESIGN OF THE GAME AND CONTRIBUTED |
+ GREATLY TO ITS CONCEPTUAL DEVELOPMENT. |
+ |
+ THANKS ARE ALSO DUE TO CARL STRANGE, HARDY TICHENOR AND STEVEN |
+ BRUELL FOR THEIR ASSISTANCE WITH CERTAIN CODING PROBLEMS. |
+ |
+ THIS GAME WAS INSPIRED BY AND RATHER LOOSELY BASED ON AN EARLIER |
+ GAME, PROGRAMMED IN THE BASIC LANGUAGE, BY JIM KORP AND GRADY HICKS. |
+ IT IS THE AUTHORS' UNDERSTANDING THAT THE BASIC GAME WAS IN TURN |
+ DERIVED FROM A STILL EARLIER VERSION IN USE AT PENN STATE UNIVERSITY. |
+ |
+ |
+ |
+ |
+ ----------REFERENCES---------- |
+ |
+ |
+ 1. STAR TREK (THE ORIGINAL TELEVISION SERIES), PRODUCED AND |
+ DIRECTED BY GENE RODENBERRY. |
+ |
+ 2. STAR TREK (THE ANIMATED TELEVISION SERIES), PRODUCED BY GENE |
+ RODENBERRY AND DIRECTED BY HAL SUTHERLAND. ALSO EXCELLENT, |
+ AND NOT JUST KIDDIE FARE. IF YOU ENJOYED THE ORIGINAL SERIES |
+ YOU SHOULD ENJOY THIS ONE (UNLESS YOU HAVE SOME SORT OF A |
+ HANGUP ABOUT WATCHING CARTOONS). |
+ |
+ 3. THE MAKING OF STAR TREK, BY STEVEN E. WHITFIELD AND GENE |
+ RODENBERRY. THE BEST AND MOST COMPLETE READILY AVAILABLE |
+ BOOK ABOUT STAR TREK. (BALLANTINE BOOKS) |
+ |
+ 4. THE WORLD OF STAR TREK, BY DAVID GERROLD. SIMILIAR IN SCOPE |
+ TO THE ABOVE BOOK. (BANTAM) |
+ |
+ 5. THE STAR TREK GUIDE, THIRD REVISION 4/17/67, BY GENE |
+ RODENBERRY. THE ORIGINAL WRITER'S GUIDE FOR THE TELEVISION |
+ SERIES, BUT LESS COMPREHENSIVE THAN (3) ABOVE. |
+ (NORWAY PRODUCTIONS) |
+ |
+ 6. THE TROUBLE WITH TRIBBLES, BY DAVID GERROLD. INCLUDES THE |
+ COMPLETE SCRIPT OF THIS POPULAR SHOW. (BALLANTINE BOOKS) |
+ |
+ 7. STAR TREK, STAR TREK 2, ..., STAR TREK 9, BY JAMES BLISH. |
+ THE ORIGINAL SHOWS IN SHORT STORY FORM. (BANTAM) |
+ |
+ 8. SPOCK MUST DIE, BY JAMES BLISH. AN ORIGINAL NOVEL, BUT |
+ RATHER SIMILAR TO THE SHOW "THE ENEMY WITHIN". (BANTAM) |
+ |
+ 9. MODEL KITS OF THE ENTERPRISE AND A "KLINGON BATTLE-CRUISER" |
+ BY AMT CORPORATION ARE AVAILABLE AT MOST HOBBY SHOPS. |
/programs/games/StarTrek/trunk/Bin |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/StarTrek/trunk/Globals.Inc |
---|
0,0 → 1,182 |
; -------------------------------------------------------------------------- |
; Global variables |
; -------------------------------------------------------------------------- |
glb_GameThreadBusy BOOL 1 |
glb_Instance HINSTANCE 0 |
glb_Allocator HANDLE 0 |
glb_MainWnd HWND 0 |
glb_Font HFONT 0 |
glb_FPU_Int32 INT32 0 |
glb_Score INT32 0 |
glb_CharSize rb SIZE.size |
glb_pConsole PTConsole 0 |
glb_pCmdBuf PTCmdBuf 0 |
glb_pRawMsgBuffer PCHAR 0 |
glb_pMsgItems PPCHAR 0 |
glb_NumMsgItems COUNT 0 |
glb_pGameData PTGameData 0 |
glb_pCommon PTCommon 0 |
glb_pMersenne PTRandom 0 |
glb_pLog PVOID 0 |
glb_MOVED BYTE 0 |
glb_LogEnabled BYTE 0 |
glb_bEmExit BYTE 0 |
glb_AttrCondition BYTE ATTR_COND_GREEN, ATTR_COND_RED, ATTR_COND_YELLOW, ATTR_COND_GREEN |
glb_ObjectMap BYTE CHAR_ROMULAN, CHAR_KLINGON, CHAR_COMMANDER, \ |
CHAR_SCOM, CHAR_ASTERISK, CHAR_PLANET, CHAR_STARBASE, \ |
CHAR_BLACK_HOLE, CHAR_THOLIAN |
glb_Plaque BYTE PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
64,' ',50,'E',PLAQUE_END_OF_LINE,\ |
38,' ',3,'E',22,' ',PLAQUE_STRING,6,'E : :',41,' ',1,':',2,' ',1,'E',PLAQUE_END_OF_LINE,\ |
36,' ',2,'E',3,' ',3,'E',19,' ',PLAQUE_STRING,6,'E : :',19,' ',\ |
PLAQUE_STRING,8,'NCC-1701',14,' ',PLAQUE_STRING,4,': E',PLAQUE_END_OF_LINE,\ |
20,' ',16,'E',8,' ',15,'E',4,' ',PLAQUE_STRING,6,'E : :',41,' ',PLAQUE_STRING,3,': E',\ |
PLAQUE_END_OF_LINE,\ |
21,' ',1,'E',37,' ',1,'E',4,' ',48,'E',PLAQUE_END_OF_LINE,\ |
22,' ',9,'E',15,' ',13,'E',17,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\ |
31,' ',7,'E',3,' ',5,'E',4,' ',1,'E',10,' ',1,'E',14,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\ |
38,' ',3,'E',11,' ',1,'E',10,' ',1,'E',12,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\ |
55,' ',1,'E',9,' ',1,'E',10,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\ |
57,' ',13,'E',6,' ',PLAQUE_STRING,4,'E E',PLAQUE_END_OF_LINE,\ |
54,' ',3,'E',1,' ',1,':',11,' ',7,'E',2,' ',8,'E',PLAQUE_END_OF_LINE,\ |
52,' ',1,':',1,'E',4,' ',1,':',17,' ',4,'E',7,' ',1,'E',PLAQUE_END_OF_LINE,\ |
51,' ',PLAQUE_STRING,8,')-E -:',5,'-',23,' ',1,'E',PLAQUE_END_OF_LINE,\ |
52,' ',1,':',1,'E',4,' ',1,':',28,' ',1,'E',PLAQUE_END_OF_LINE,\ |
54,' ',2,'E',2,' ',1,':',20,' ',8,'E',PLAQUE_END_OF_LINE,\ |
56,' ',23,'E',PLAQUE_END_OF_LINE,\ |
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
55,' ',PLAQUE_STRING,19,'U. S. S. ENTERPRISE',PLAQUE_END_OF_LINE,\ |
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
34,' ',PLAQUE_STRING,43,'FOR DEMONSTRATING OUTSTANDING ABILITY AS A ',\ |
PLAQUE_STRING,16,'STARSHIP CAPTAIN',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
48,' ',PLAQUE_STRING,32,'STARFLEET COMMAND BESTOWS TO YOU',PLAQUE_END_OF_LINE,\ |
PLAQUE_END_OF_LINE,PLAQUE_INSERT_NAME,PLAQUE_END_OF_LINE,\ |
59,' ',PLAQUE_STRING,11,'THE RANK OF',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
55,' ',PLAQUE_STRING,20,'"COMMODORE EMERITUS"',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
58,' ',PLAQUE_INSERT_LEVEL,PLAQUE_STRING,6,' LEVEL',PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
54,' ',PLAQUE_STRING,12,'THIS DAY OF ',PLAQUE_INSERT_DATE,PLAQUE_END_OF_LINE,\ |
PLAQUE_END_OF_LINE,56,' ',PLAQUE_STRING,13,'YOUR SCORE: ',PLAQUE_INSERT_SCORE,\ |
PLAQUE_END_OF_LINE,PLAQUE_END_OF_LINE,\ |
52,' ',PLAQUE_STRING,24,'KLINGONS PER STARDATE: ',PLAQUE_INSERT_KLRATE,\ |
PLAQUE_END_OF_LINE,PLAQUE_END_OF_ALL |
align 2 |
str_MainWndClass du 'SST32-FASM',0 |
str_MainWndTitle du 'STAR TREK',0 |
str_FontFace du 'Courier',0 |
str_CharSizeText du 'Mj',0 |
str_SetDirFailed du 'Unable to Set Current Directory. Please check permissions.',0 |
str_MsgFileName du 'MsgTable.txt',0 |
str_LogFileName du 'STARTREK.LOG',0 |
str_FileMask du '*.TRK',0 |
str_THOLIANX db 'THOLIANX',0 |
str_TRK db '.TRK',0 |
str_CmdListGames db '?.TRK',0 |
str_EmSaveGame db 'EMSAVE.TRK',0 |
str_PlaqueFile db 'PLAQUE.TXT',0 |
align 16 |
glb_dbl_2e31 DOUBLE 2147483648.0 |
glb_dbl_2e32 DOUBLE 4294967296.0 |
glb_dbl_Ten DOUBLE 10.0 |
glb_dbl_FpuPopper DOUBLE 0.0 |
glb_dbl_0dot0625 DOUBLE 0.0625 |
glb_dbl_0dot08 DOUBLE 0.08 |
glb_dbl_0dot095 DOUBLE 0.095 |
glb_dbl_0dot1 DOUBLE 0.1 |
glb_dbl_0dot01 DOUBLE 0.01 |
glb_dbl_0dot001 DOUBLE 0.001 |
glb_dbl_0dot2 DOUBLE 0.2 |
glb_dbl_0dot02 DOUBLE 0.02 |
glb_dbl_0dot00001 DOUBLE 0.00001 |
glb_dbl_0dot2777 DOUBLE 0.2777 |
glb_dbl_0dot1777777777 DOUBLE 0.1777777777 |
glb_dbl_0dot15 DOUBLE 0.15 |
glb_dbl_0dot015 DOUBLE 0.015 |
glb_dbl_0dot5 DOUBLE 0.5 |
glb_dbl_0dot5235998 DOUBLE 0.5235998 |
glb_dbl_0dot5235988 DOUBLE 0.5235988 |
glb_dbl_0dot3 DOUBLE 0.3 |
glb_dbl_0dot03 DOUBLE 0.03 |
glb_dbl_0dot333 DOUBLE 0.3333333333 |
glb_dbl_1dot5 DOUBLE 1.5 |
glb_dbl_10dot5 DOUBLE 10.5 |
glb_dbl_2dot5 DOUBLE 2.5 |
glb_dbl_1dot2 DOUBLE 1.2 |
glb_dbl_1dot23 DOUBLE 1.23 |
glb_dbl_1dot4142 DOUBLE 1.4142 |
glb_dbl_1dot57079633 DOUBLE 1.57079633 |
glb_dbl_1dot01 DOUBLE 1.01 |
glb_dbl_1dot90985932 DOUBLE 1.90985932 |
glb_dbl_0dot04 DOUBLE 0.04 |
glb_dbl_0dot4 DOUBLE 0.4 |
glb_dbl_0dot45 DOUBLE 0.45 |
glb_dbl_0dot49 DOUBLE 0.49 |
glb_dbl_0dot05 DOUBLE 0.05 |
glb_dbl_0dot005 DOUBLE 0.005 |
glb_dbl_0dot00038 DOUBLE 0.00038 |
glb_dbl_0dot006 DOUBLE 0.006 |
glb_dbl_0dot75 DOUBLE 0.75 |
glb_dbl_0dot77 DOUBLE 0.77 |
glb_dbl_0dot65 DOUBLE 0.65 |
glb_dbl_0dot6 DOUBLE 0.6 |
glb_dbl_0dot89 DOUBLE 0.89 |
glb_dbl_0dot8 DOUBLE 0.8 |
glb_dbl_0dot9 DOUBLE 0.9 |
glb_dbl_0dot99 DOUBLE 0.99 |
glb_dbl_9dot99 DOUBLE 9.99 |
glb_dbl_0dot98 DOUBLE 0.98 |
glb_dbl_0dot995 DOUBLE 0.995 |
glb_dbl_DOCKFAC DOUBLE 0.25 |
glb_dbl_100 DOUBLE 100.0 |
glb_dbl_200 DOUBLE 200.0 |
glb_dbl_270 DOUBLE 270.0 |
glb_dbl_66dot666 DOUBLE 66.666666666 |
glb_dbl_2 DOUBLE 2.0 |
glb_dbl_20 DOUBLE 20.0 |
glb_dbl_3 DOUBLE 3.0 |
glb_dbl_31 DOUBLE 31.0 |
glb_dbl_39dot95 DOUBLE 39.95 |
glb_dbl_4 DOUBLE 4.0 |
glb_dbl_4dot5 DOUBLE 4.5 |
glb_dbl_5 DOUBLE 5.0 |
glb_dbl_6 DOUBLE 6.0 |
glb_dbl_8 DOUBLE 8.0 |
glb_dbl_25 DOUBLE 25.0 |
glb_dbl_125 DOUBLE 125.0 |
glb_dbl_50 DOUBLE 50.0 |
glb_dbl_150 DOUBLE 150.0 |
glb_dbl_950 DOUBLE 950.0 |
glb_dbl_7 DOUBLE 7.0 |
glb_dbl_7dot5 DOUBLE 7.5 |
glb_dbl_9 DOUBLE 9.0 |
glb_dbl_7dot853981634 DOUBLE 7.853981634 |
glb_dbl_15 DOUBLE 15.0 |
glb_dbl_12 DOUBLE 12.0 |
glb_dbl_1175 DOUBLE 1175.0 |
glb_dbl_75 DOUBLE 75.0 |
glb_dbl_300 DOUBLE 300.0 |
glb_dbl_30 DOUBLE 30.0 |
glb_dbl_3000 DOUBLE 3000.0 |
glb_dbl_400 DOUBLE 400.0 |
glb_dbl_500 DOUBLE 500.0 |
glb_dbl_600 DOUBLE 600.0 |
glb_dbl_700 DOUBLE 700.0 |
glb_dbl_800 DOUBLE 800.0 |
glb_dbl_7200 DOUBLE 7200.0 |
glb_dbl_450 DOUBLE 450.0 |
glb_dbl_1000 DOUBLE 1000.0 |
glb_dbl_5000 DOUBLE 5000.0 |
glb_dbl_2500 DOUBLE 2500.0 |
glb_dbl_1400 DOUBLE 1400.0 |
glb_dbl_1500 DOUBLE 1500.0 |
glb_dbl_1250 DOUBLE 1250.0 |
glb_dbl_1E38 DOUBLE 1e38 |
glb_dbl_3E_neg_5 DOUBLE 3e-5 |
glb_dbl_KlingonsPerDate DOUBLE 0.0 |
; --- EOF --- |
/programs/games/StarTrek/trunk/Imports.Inc |
---|
0,0 → 1,680 |
; Import Section |
dd 0, 0, 0, RVA kernel32, RVA kernel32tbl |
dd 0, 0, 0, RVA user32, RVA user32tbl |
dd 0, 0, 0, RVA gdi32, RVA gdi32tbl |
dd 0, 0, 0, 0, 0 |
kernel32tbl: |
;{W32} |
GetLocalTime dd RVA _GetLocalTime |
;{W32} |
SetFilePointer dd RVA _SetFilePointer |
;{W32} |
GetFileAttributes dd RVA _GetFileAttributes |
;{W32} |
SetCurrentDir dd RVA _SetCurrentDir |
;{W32} |
GetConsoleScrBufInfo dd RVA _GetConsoleScrBufInfo |
;{W32} |
GetConsoleMode dd RVA _GetConsoleMode |
;{W32} |
GetStdHandle dd RVA _GetStdHandle |
;{W32} |
FreeConsole dd RVA _FreeConsole |
;{W32} |
AllocConsole dd RVA _AllocConsole |
;{W32} |
CreateThread dd RVA _CreateThread |
;{W32} |
Sleep dd RVA _Sleep |
;{W32} |
MulDiv dd RVA _MulDiv |
;{W32} |
VirtualFree dd RVA _VirtualFree |
;{W32} |
VirtualAlloc dd RVA _VirtualAlloc |
;{W32} |
GetFileSize dd RVA _GetFileSize |
;{W32} |
WriteFile dd RVA _WriteFile |
;{W32} |
ReadFile dd RVA _ReadFile |
;{W32} |
CloseHandle dd RVA _CloseHandle |
;{W32} |
CreateFile dd RVA _CreateFile |
;{W32} |
CreateFileAnsi dd RVA _CreateFileAnsi |
;{W32} |
GetTickCount dd RVA _GetTickCount |
;{W32} |
FindClose dd RVA _FindClose |
;{W32} |
FindNextFile dd RVA _FindNextFile |
;{W32} |
FindFirstFile dd RVA _FindFirstFile |
;{W32} |
GetProcessHeap dd RVA _GetProcessHeap |
;{W32} |
GetModuleFileName dd RVA _GetModuleFileName |
;{W32} |
OutputDebugString dd RVA _OutputDebugString |
;{W32} |
HeapCreate dd RVA _HeapCreate |
;{W32} |
HeapAlloc dd RVA _HeapAlloc |
;{W32} |
HeapReAlloc dd RVA _HeapReAlloc |
;{W32} |
HeapFree dd RVA _HeapFree |
;{W32} |
HeapDestroy dd RVA _HeapDestroy |
;{W32} |
GetModuleHandle dd RVA _GetModuleHandle |
;{W32} |
ExitProcess dd RVA _ExitProcess |
dd 0 |
user32tbl: |
;{W32} |
OffsetRect dd RVA _OffsetRect |
;{W32} |
AdjustWindowRect dd RVA _AdjustWindowRect |
;{W32} |
MessageBeep dd RVA _MessageBeep |
;{W32} |
GetCursorPos dd RVA _GetCursorPos |
;{W32} |
TrackPopupMenu dd RVA _TrackPopupMenu |
;{W32} |
AppendMenu dd RVA _AppendMenu |
;{W32} |
DestroyMenu dd RVA _DestroyMenu |
;{W32} |
CreatePopupMenu dd RVA _CreatePopupMenu |
;{W32} |
GetFocus dd RVA _GetFocus |
;{W32} |
GetWindowTextLen dd RVA _GetWindowTextLen |
;{W32} |
GetWindowText dd RVA _GetWindowText |
;{W32} |
GetDlgItem dd RVA _GetDlgItem |
;{W32} |
PostMessage dd RVA _PostMessage |
;{W32} |
SendMessage dd RVA _SendMessage |
;{W32} |
InflateRect dd RVA _InflateRect |
;{W32} |
EndDialog dd RVA _EndDialog |
;{W32} |
DlgBoxParam dd RVA _DlgBoxParam |
;{W32} |
GetSystemMetrics dd RVA _GetSystemMetrics |
;{W32} |
DrawIcon dd RVA _DrawIcon |
;{W32} |
DrawText dd RVA _DrawText |
;{W32} |
ReleaseCapture dd RVA _ReleaseCapture |
;{W32} |
SetCapture dd RVA _SetCapture |
;{W32} |
SetWindowText dd RVA _SetWindowText |
;{W32} |
SetCursor dd RVA _SetCursor |
;{W32} |
ReleaseDC dd RVA _ReleaseDC |
;{W32} |
GetDC dd RVA _GetDC |
;{W32} |
FrameRect dd RVA _FrameRect |
;{W32} |
FillRect dd RVA _FillRect |
;{W32} |
EndPaint dd RVA _EndPaint |
;{W32} |
BeginPaint dd RVA _BeginPaint |
;{W32} |
UpdateWindow dd RVA _UpdateWindow |
;{W32} |
PostQuitMessage dd RVA _PostQuitMessage |
;{W32} |
LoadBitmap dd RVA _LoadBitmap |
;{W32} |
LoadImage dd RVA _LoadImage |
;{W32} |
LoadIcon dd RVA _LoadIcon |
;{W32} |
LoadCursor dd RVA _LoadCursor |
;{W32} |
GetWindowRect dd RVA _GetWindowRect |
;{W32} |
GetClientRect dd RVA _GetClientRect |
;{W32} |
ShowWindow dd RVA _ShowWindow |
;{W32} |
CreateWindowEx dd RVA _CreateWindowEx |
;{W32} |
DefWindowProc dd RVA _DefWindowProc |
;{W32} |
RegisterClass dd RVA _RegisterClass |
;{W32} |
GetClassInfo dd RVA _GetClassInfo |
;{W32} |
SetWindowLong dd RVA _SetWindowLong |
;{W32} |
GetWindowLong dd RVA _GetWindowLong |
;{W32} |
GetMessage dd RVA _GetMessage |
;{W32} |
DispatchMessage dd RVA _DispatchMessage |
;{W32} |
TranslateMessage dd RVA _TranslateMessage |
;{W32} |
TranslateAccelerator dd RVA _TranslateAccelerator |
;{W32} |
CreateAcceleratorTable dd RVA _CreateAcceleratorTable |
;{W32} |
InvalidateRect dd RVA _InvalidateRect |
;{W32} |
MoveWindow dd RVA _MoveWindow |
;{W32} |
IsWindowVisible dd RVA _IsWindowVisible |
;{W32} |
MessageBox dd RVA _MessageBox |
dd 0 |
gdi32tbl: |
;{W32} |
TextOut dd RVA _TextOut |
;{W32} |
MoveToEx dd RVA _MoveToEx |
;{W32} |
SetTextAlign dd RVA _SetTextAlign |
;{W32} |
BitBlt dd RVA _BitBlt |
;{W32} |
CreateCompatibleBitmap dd RVA _CreateCompatibleBitmap |
;{W32} |
DeleteDC dd RVA _DeleteDC |
;{W32} |
SetTextColor dd RVA _SetTextColor |
;{W32} |
CreatePatternBrush dd RVA _CreatePatternBrush |
;{W32} |
GetStockObject dd RVA _GetStockObject |
;{W32} |
CreatePen dd RVA _CreatePen |
;{W32} |
Polyline dd RVA _Polyline |
;{W32} |
CreateSolidBrush dd RVA _CreateSolidBrush |
;{W32} |
DeleteObject dd RVA _DeleteObject |
;{W32} |
CreateFontIndirect dd RVA _CreateFontIndirect |
;{W32} |
GetDeviceCaps dd RVA _GetDeviceCaps |
;{W32} |
GetTextExtentPoint32 dd RVA _GetTextExtentPoint32 |
;{W32} |
SetBkMode dd RVA _SetBkMode |
;{W32} |
SelectObject dd RVA _SelectObject |
;{W32} |
CreateCompatibleDC dd RVA _CreateCompatibleDC |
dd 0 |
; --- Modules |
kernel32 db 'KERNEL32.DLL', 0 |
user32 db 'USER32.DLL', 0 |
gdi32 db 'GDI32.DLL', 0 |
; --- Table |
align 2 |
_GetLocalTime dw 0 |
db 'GetLocalTime',0 |
align 2 |
_SetFilePointer dw 0 |
db 'SetFilePointer',0 |
align 2 |
_GetFileAttributes dw 0 |
db 'GetFileAttributesA',0 |
align 2 |
_SetCurrentDir dw 0 |
db 'SetCurrentDirectoryW',0 |
align 2 |
_OffsetRect dw 0 |
db 'OffsetRect',0 |
align 2 |
_GetConsoleScrBufInfo dw 0 |
db 'GetConsoleScreenBufferInfo',0 |
align 2 |
_GetConsoleMode dw 0 |
db 'GetConsoleMode',0 |
align 2 |
_FreeConsole dw 0 |
db 'FreeConsole',0 |
align 2 |
_GetStdHandle dw 0 |
db 'GetStdHandle',0 |
align 2 |
_AllocConsole dw 0 |
db 'AllocConsole',0 |
align 2 |
_CreateThread dw 0 |
db 'CreateThread',0 |
align 2 |
_Sleep dw 0 |
db 'Sleep',0 |
align 2 |
_AdjustWindowRect dw 0 |
db 'AdjustWindowRect',0 |
align 2 |
_MessageBeep dw 0 |
db 'MessageBeep',0 |
align 2 |
_TextOut dw 0 |
db 'TextOutW',0 |
align 2 |
_MoveToEx dw 0 |
db 'MoveToEx',0 |
align 2 |
_SetTextAlign dw 0 |
db 'SetTextAlign',0 |
align 2 |
_BitBlt dw 0 |
db 'BitBlt',0 |
align 2 |
_CreateCompatibleBitmap dw 0 |
db 'CreateCompatibleBitmap',0 |
align 2 |
_DeleteDC dw 0 |
db 'DeleteDC',0 |
align 2 |
_MulDiv dw 0 |
db 'MulDiv',0 |
align 2 |
_GetCursorPos dw 0 |
db 'GetCursorPos',0 |
align 2 |
_TrackPopupMenu dw 0 |
db 'TrackPopupMenu',0 |
align 2 |
_AppendMenu dw 0 |
db 'AppendMenuW',0 |
align 2 |
_DestroyMenu dw 0 |
db 'DestroyMenu',0 |
align 2 |
_CreatePopupMenu dw 0 |
db 'CreatePopupMenu',0 |
align 2 |
_GetFocus dw 0 |
db 'GetFocus',0 |
align 2 |
_SetTextColor dw 0 |
db 'SetTextColor',0 |
align 2 |
_GetWindowTextLen dw 0 |
db 'GetWindowTextLengthW',0 |
align 2 |
_GetWindowText dw 0 |
db 'GetWindowTextW',0 |
align 2 |
_CreatePatternBrush dw 0 |
db 'CreatePatternBrush',0 |
align 2 |
_GetDlgItem dw 0 |
db 'GetDlgItem',0 |
align 2 |
_VirtualFree dw 0 |
db 'VirtualFree',0 |
align 2 |
_VirtualAlloc dw 0 |
db 'VirtualAlloc',0 |
align 2 |
_ImageList_AddMasked dw 0 |
db 'ImageList_AddMasked',0 |
align 2 |
_ImageList_Create dw 0 |
db 'ImageList_Create',0 |
align 2 |
_PostMessage dw 0 |
db 'PostMessageW',0 |
align 2 |
_SendMessage dw 0 |
db 'SendMessageW',0 |
align 2 |
_GetFileSize dw 0 |
db 'GetFileSize',0 |
align 2 |
_WriteFile dw 0 |
db 'WriteFile',0 |
align 2 |
_ReadFile dw 0 |
db 'ReadFile',0 |
align 2 |
_CloseHandle dw 0 |
db 'CloseHandle',0 |
align 2 |
_CreateFile dw 0 |
db 'CreateFileW',0 |
align 2 |
_CreateFileAnsi dw 0 |
db 'CreateFileA',0 |
align 2 |
_InflateRect dw 0 |
db 'InflateRect',0 |
align 2 |
_EndDialog dw 0 |
db 'EndDialog',0 |
align 2 |
_DlgBoxParam dw 0 |
db 'DialogBoxIndirectParamW',0 |
align 2 |
_GetSystemMetrics dw 0 |
db 'GetSystemMetrics',0 |
align 2 |
_GetStockObject dw 0 |
db 'GetStockObject',0 |
align 2 |
_GetTickCount dw 0 |
db 'GetTickCount',0 |
align 2 |
_FindClose dw 0 |
db 'FindClose',0 |
align 2 |
_FindNextFile dw 0 |
db 'FindNextFileW',0 |
align 2 |
_FindFirstFile dw 0 |
db 'FindFirstFileW',0 |
align 2 |
_DrawText dw 0 |
db 'DrawTextW',0 |
align 2 |
_DrawIcon dw 0 |
db 'DrawIcon',0 |
align 2 |
_CreatePen dw 0 |
db 'CreatePen',0 |
align 2 |
_Polyline dw 0 |
db 'Polyline',0 |
align 2 |
_CreateSolidBrush dw 0 |
db 'CreateSolidBrush',0 |
align 2 |
_DeleteObject dw 0 |
db 'DeleteObject',0 |
align 2 |
_SetCapture dw 0 |
db 'SetCapture',0 |
align 2 |
_ReleaseCapture dw 0 |
db 'ReleaseCapture',0 |
align 2 |
_SetWindowText dw 0 |
db 'SetWindowTextW',0 |
align 2 |
_InitCommonControlsEx dw 0 |
db 'InitCommonControlsEx',0 |
align 2 |
_SetCursor dw 0 |
db 'SetCursor',0 |
align 2 |
_GetProcessHeap dw 0 |
db 'GetProcessHeap',0 |
align 2 |
_CreateFontIndirect dw 0 |
db 'CreateFontIndirectW',0 |
align 2 |
_GetDeviceCaps dw 0 |
db 'GetDeviceCaps',0 |
align 2 |
_ReleaseDC dw 0 |
db 'ReleaseDC',0 |
align 2 |
_GetDC dw 0 |
db 'GetDC',0 |
align 2 |
_GetTextExtentPoint32 dw 0 |
db 'GetTextExtentPoint32W',0 |
align 2 |
_GetModuleFileName dw 0 |
db 'GetModuleFileNameW',0 |
align 2 |
_FrameRect dw 0 |
db 'FrameRect',0 |
align 2 |
_FillRect dw 0 |
db 'FillRect',0 |
align 2 |
_SetBkMode dw 0 |
db 'SetBkMode',0 |
align 2 |
_EndPaint dw 0 |
db 'EndPaint',0 |
align 2 |
_BeginPaint dw 0 |
db 'BeginPaint',0 |
align 2 |
_SelectObject dw 0 |
db 'SelectObject',0 |
align 2 |
_OutputDebugString dw 0 |
db 'OutputDebugStringW',0 |
align 2 |
_HeapCreate dw 0 |
db 'HeapCreate',0 |
align 2 |
_HeapAlloc dw 0 |
db 'HeapAlloc',0 |
align 2 |
_HeapReAlloc dw 0 |
db 'HeapReAlloc',0 |
align 2 |
_HeapFree dw 0 |
db 'HeapFree',0 |
align 2 |
_HeapDestroy dw 0 |
db 'HeapDestroy',0 |
align 2 |
_IsWindowVisible dw 0 |
db 'IsWindowVisible',0 |
align 2 |
_MoveWindow dw 0 |
db 'MoveWindow',0 |
align 2 |
_InvalidateRect dw 0 |
db 'InvalidateRect',0 |
align 2 |
_UpdateWindow dw 0 |
db 'UpdateWindow',0 |
align 2 |
_CreateAcceleratorTable dw 0 |
db 'CreateAcceleratorTableW',0 |
align 2 |
_TranslateAccelerator dw 0 |
db 'TranslateAccelerator',0 |
align 2 |
_TranslateMessage dw 0 |
db 'TranslateMessage',0 |
align 2 |
_DispatchMessage dw 0 |
db 'DispatchMessageW',0 |
align 2 |
_GetMessage dw 0 |
db 'GetMessageW',0 |
align 2 |
_PostQuitMessage dw 0 |
db 'PostQuitMessage',0 |
align 2 |
_LoadBitmap dw 0 |
db 'LoadBitmapW',0 |
align 2 |
_LoadImage dw 0 |
db 'LoadImageW',0 |
align 2 |
_LoadIcon dw 0 |
db 'LoadIconW',0 |
align 2 |
_LoadCursor dw 0 |
db 'LoadCursorW',0 |
align 2 |
_GetWindowRect dw 0 |
db 'GetWindowRect',0 |
align 2 |
_GetClientRect dw 0 |
db 'GetClientRect',0 |
align 2 |
_ShowWindow dw 0 |
db 'ShowWindow',0 |
align 2 |
_CreateWindowEx dw 0 |
db 'CreateWindowExW',0 |
align 2 |
_DefWindowProc dw 0 |
db 'DefWindowProcW',0 |
align 2 |
_RegisterClass dw 0 |
db 'RegisterClassW',0 |
align 2 |
_GetClassInfo dw 0 |
db 'GetClassInfoW',0 |
align 2 |
_SetWindowLong dw 0 |
db 'SetWindowLongW',0 |
align 2 |
_GetWindowLong dw 0 |
db 'GetWindowLongW',0 |
align 2 |
_GetModuleHandle dw 0 |
db 'GetModuleHandleW',0 |
align 2 |
_CreateCompatibleDC dw 0 |
db 'CreateCompatibleDC',0 |
align 2 |
_ExitProcess dw 0 |
db 'ExitProcess',0 |
align 2 |
_MessageBox dw 0 |
db 'MessageBoxW',0 |
;<EOF> |
/programs/games/StarTrek/trunk/MAIN.ASM |
---|
0,0 → 1,98 |
; -------------------------------------------------------------------------- |
; Win32 PE File Template |
; {BINEXT=EXE} (Do not edit or remove this line) |
; -------------------------------------------------------------------------- |
; ********************************************************************* |
; * PERMISSION IS HEREBY GRANTED FOR THE COPYING, * |
; * DISTRIBUTION, MODIFICATION AND USE OF THIS PROGRAM AND * |
; * ASSOCIATED DOCUMENTATION FOR RECREATIONAL PURPOSES, * |
; * PROVIDED THAT ALL REFERENCES TO THE AUTHOR ARE RETAINED. * |
; * HOWEVER, PERMISSION IS NOT AND WILL NOT BE GRANTED FOR * |
; * THE SALE OR PROMOTIONAL USE OF THIS PROGRAM OR PROGRAM * |
; * DOCUMENTATION, OR FOR USE IN ANY SITUATION IN WHICH * |
; * PROFIT MAY BE CONSIDERED AN OBJECTIVE, SINCE IT IS THE * |
; * DESIRE OF THE AUTHOR TO RESPECT THE COPYRIGHTS OF THE * |
; * ORIGINATORS OF STAR TREK. * |
; ********************************************************************* |
format PE GUI 4.0 |
entry start |
stack 10000h, 10000h |
; -------------------------------------------------------------------------- |
; Definitions |
; -------------------------------------------------------------------------- |
include 'Macros.Inc' |
include 'Win32.Inc' |
include 'TConsole.Inc' |
include 'TCmdBuf.Inc' |
include 'TCommon.Inc' |
include 'TRandom.Inc' |
include 'TLog.Inc' |
;{INCLDEF} (Definitions will be inserted before this line) |
PROC_ALIGN equ 8 |
; -------------------------------------------------------------------------- |
; Data Section |
; -------------------------------------------------------------------------- |
section '.data' data readable writeable |
include 'Globals.Inc' |
; -------------------------------------------------------------------------- |
; Code Modules |
; -------------------------------------------------------------------------- |
section '.code' code readable executable |
include 'TApp.Asm' |
include 'TConsole.Asm' |
include 'TString.Asm' |
include 'TCmdBuf.Asm' |
include 'TGame.Asm' |
include 'TMsgTable.Asm' |
include 'TCommon.Asm' |
include 'TRandom.Asm' |
include 'TArray.Asm' |
include 'TFormat.Asm' |
include 'TSrScan.Asm' |
include 'TLrScan.Asm' |
include 'TChart.Asm' |
include 'TMove.Asm' |
include 'TFinish.Asm' |
include 'TAttack.Asm' |
include 'TEvents.Asm' |
include 'TNova.Asm' |
include 'TPhasers.Asm' |
include 'TShields.Asm' |
include 'TDock.Asm' |
include 'TPhotons.Asm' |
include 'TPlanet.Asm' |
include 'TImpulse.Asm' |
include 'TLog.Asm' |
;{INCLIMPL} (Code modules will be inserted before this line) |
; -------------------------------------------------------------------------- |
; Entry Point |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
start: |
call TApp_SetLocalDir |
jnc .exit |
call TApp_Init |
call TApp_Run |
.exit: |
invoke ExitProcess, 0 |
; -------------------------------------------------------------------------- |
; Imports |
; -------------------------------------------------------------------------- |
section '.idata' import data readable writeable |
include 'Imports.Inc' |
; --- EOF --- |
/programs/games/StarTrek/trunk/Macros.Inc |
---|
0,0 → 1,292 |
_DEBUG = 1 |
; --- Parameters inside WndProc |
hWnd equ [ebp + 8] |
uiMsg equ [ebp + 12] |
WParam equ [ebp + 16] |
LParam equ [ebp + 20] |
; --- Splitting WndProc parameters |
macro mcLPtoXY LParam { |
; OUT: EDX = Y coordinate or HEIGHT |
; OUT: EAX = X coordinate or WIDTH |
mov eax, LParam |
mov edx, LParam |
and eax, 0000FFFFh |
shr edx, 16 |
} |
; --- String operation (WCHAR) |
macro mcStrCopy { |
xor eax, eax |
@@: |
lodsw |
stosw |
test eax, eax |
jnz @r |
} |
; --- Indirectly call STDCALL procedure |
macro invoke api_proc, [arg] |
{ |
common |
if ~ arg eq |
reverse |
pushd arg |
common |
end if |
call [api_proc] |
} |
macro rinvoke api_proc_reg, [arg] |
{ |
common |
if ~ arg eq |
reverse |
pushd arg |
common |
end if |
call api_proc_reg |
} |
; --- FPU |
macro mcFpuPushR32 r32 |
{ |
mov [glb_FPU_Int32], r32 |
fild [glb_FPU_Int32] |
} |
macro mcFpuPop |
{ |
fstp [glb_dbl_FpuPopper] |
} |
; --- Heap allocator |
macro mcMemAlloc hHeap, nBytes { |
invoke HeapAlloc, hHeap, HEAP_NO_SERIALIZE, nBytes |
} |
macro mcMemFree hHeap, pBuf { |
invoke HeapFree, hHeap, HEAP_NO_SERIALIZE, pBuf |
} |
macro mcGlobalMalloc nBytes { |
mcMemAlloc [glb_HAllocator], nBytes |
} |
macro mcGlobalFree pBuf { |
mcMemFree [glb_HAllocator], pBuf |
} |
; --- Page allocator |
macro mcAllocatePages nBytes { |
invoke VirtualAlloc, 0, nBytes, \ |
MEM_RESERVE or MEM_COMMIT, \ |
PAGE_READWRITE |
} |
macro mcReleasePages pData { |
invoke VirtualFree, pData, 0, MEM_RELEASE |
} |
; --- Local variables |
macro mcLoadLocalRef AnyReg, instance { |
lea AnyReg, [esp + instance] |
} |
macro mcLoadLocal AnyReg, instance { |
mov AnyReg, [esp + instance] |
} |
macro mcStoreThis { |
mov [esp], ebx |
} |
macro mcLoadThis { |
mov ebx, [esp] |
} |
macro mcStoreLocal instance, AnyReg { |
mov [esp + instance], AnyReg |
} |
macro mcBeginLocals LocalSize { |
sub esp, LocalSize |
} |
macro mcEndLocals LocalSize { |
add esp, LocalSize |
} |
; --- Virtual call on the object instance |
macro mcVirtCallOnEBX OfsMethod { |
mov eax, [ebx] |
call dword [eax + OfsMethod] |
} |
macro mcVirtCall Instance, OfsMethod { |
lea ebx, [Instance] |
mov eax, [ebx] |
call dword [eax + OfsMethod] |
} |
; --- CALLBACK |
macro mcProlog { |
push ebp |
mov ebp, esp |
push ebx |
push esi |
push edi |
} |
macro mcEpilog { |
pop edi |
pop esi |
pop ebx |
leave |
} |
; --- Misc... |
macro mc_CMP_ST0_ST1 |
{ |
fcomip st, st1 |
fstp [glb_dbl_FpuPopper] |
} |
macro mcLoadQuadStatePtr r32 |
{ |
mov r32, [glb_pGameState] |
add r32, TGameState.game_QuadState |
} |
macro mcLoadNeg1 r32 |
{ |
mcZeroBits r32 |
dec r32 |
} |
macro mcLoad8bitsToReg32 r32, _8bit_value |
{ |
push _8bit_value |
pop r32 |
} |
macro mcLoad1 r32 |
{ |
mcZeroBits r32 |
inc r32 |
} |
; ESI = source |
; EDI = destination |
macro mcMemCopy nBytesAligned4 |
{ |
mov ecx, nBytesAligned4 |
shr ecx, 2 |
rep movsd |
} |
macro mcMul10 r32 { |
push esi |
shl r32, 1 |
push r32 |
shl r32, 2 |
pop esi |
add r32, esi |
pop esi |
} |
macro mcZeroBits any_reg { |
xor any_reg, any_reg |
} |
macro mcLoadRGB reg32, r8, g8, b8 { |
mov reg32, (b8 shl 16) or (g8 shl 8) or r8 |
} |
; --- Rectangle |
macro mcRectCopy { |
; ESI = source rectangle |
; EDI = target rectangle |
movsd |
movsd |
movsd |
movsd |
} |
macro mcRectCopySafe { |
; ESI = source rectangle |
; EDI = target rectangle |
push esi |
movsd |
movsd |
movsd |
movsd |
pop esi |
} |
macro mcRectWidth r32, pRect { |
mov r32, [pRect + RECT.rc_Right] |
sub r32, [pRect + RECT.rc_Left] |
} |
macro mcRectHeight r32, pRect { |
mov r32, [pRect + RECT.rc_Bottom] |
sub r32, [pRect + RECT.rc_Top] |
} |
; --- Branching |
macro mcOnRegEqu AnyReg, AnyValue, AnyLabel { |
cmp AnyReg, AnyValue |
je AnyLabel |
} |
macro mcOnRegNotEqu AnyReg, AnyValue, AnyLabel { |
cmp AnyReg, AnyValue |
jne AnyLabel |
} |
macro mcOnRegZero AnyReg, AnyLabel { |
test AnyReg, AnyReg |
jz AnyLabel |
} |
macro mcOnRegNotZero AnyReg, AnyLabel { |
test AnyReg, AnyReg |
jnz AnyLabel |
} |
; --- OOP |
macro mcLoadMemberRef AnyReg, instance { |
lea AnyReg, [ebx + instance] |
} |
macro mcLoadMember AnyReg, instance { |
mov AnyReg, [ebx + instance] |
} |
macro mcStoreMember instance, AnyReg { |
mov [ebx + instance], AnyReg |
} |
macro mcAttachVTable addrvtbl { |
mov eax, addrvtbl |
mov [ebx], eax |
} |
; --- EOF --- |
/programs/games/StarTrek/trunk/TApp.Asm |
---|
0,0 → 1,770 |
; -------------------------------------------------------------------------- |
; FILE: TApp.Asm |
; DATE: September 21, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; DESTRCT |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc84: |
.nCountDown COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_SelfDestruct: |
mcBeginLocals loc84.size |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
jnc .L5 |
call TConsole_ScrollUp |
mov ecx, 686 |
call TConsole_ProutGameMsg |
call TConsole_ScrollUp |
jmp .done |
.L5: |
call TConsole_ScrollUp |
mov ecx, 290 |
call TConsole_ProutGameMsg |
mov ecx, 687 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 10 |
mcStoreLocal loc84.nCountDown, ecx |
.pre_sequence: |
mov ecx, 694 |
call TConsole_Cram |
mcLoadLocal eax, loc84.nCountDown |
call TConsole_CramInt |
call TConsole_RefreshCaretLine |
invoke Sleep, 1000 |
dec [esp + loc84.nCountDown] |
cmp [esp + loc84.nCountDown], 6 |
jae .pre_sequence |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
mov ecx, 689 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TGame_Prompt |
call TConsole_ScrollUp |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .password_rejected |
mcLoadGameDataPtr edi |
add edi, TREKDATA.PASSWD |
call TString_AnsiEqual |
jnc .password_rejected |
mov ecx, 692 |
call TConsole_ProutGameMsg |
mov cl, 22 |
call TConsole_RepeatBlank |
.final_sequence: |
mov ecx, 694 |
call TConsole_Cram |
mcLoadLocal eax, loc84.nCountDown |
call TConsole_CramInt |
call TConsole_RefreshCaretLine |
invoke Sleep, 1000 |
dec [esp + loc84.nCountDown] |
jnz .final_sequence |
call TConsole_ScrollUp |
fld [glb_dbl_0dot05] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jnc .everyone_wasted |
mov ecx, 693 |
call TConsole_ProutGameMsg |
invoke Sleep, 1000 |
.everyone_wasted: |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
call TPlanet_KaBoom |
jmp .done |
.password_rejected: |
mov ecx, 695 |
call TConsole_ProutGameMsg |
inc ecx |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
.done: |
mcEndLocals loc84.size |
ret |
; -------------------------------------------------------------------------- |
; PLAQUE |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc112: |
.pNextInByte PCHAR ? |
.pNextOutByte PCHAR ? |
.bufAnsiValue CHARS 16 |
.bufAnsiKirkAlias CHARS 32 |
.pAllocatedOutBuffer PCHAR ? |
.timeNow rb SYSTIME.size |
.nLenName COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_PlaqueProcessor: |
mcBeginLocals loc112.size |
mov ecx, 727 |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .done |
mcLoadLocalRef edi, loc112.bufAnsiKirkAlias |
call TString_AnsiCopy |
mov esi, glb_Plaque |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, 8192 ; <-- 2 pages is enough! |
mcStoreLocal loc112.pAllocatedOutBuffer, eax |
mcStoreLocal loc112.pNextOutByte, eax |
mcStoreLocal loc112.pNextInByte, esi |
.load_input_byte: |
mcLoadLocal esi, loc112.pNextInByte |
inc [esp + loc112.pNextInByte] |
mov al, [esi] |
mcOnRegEqu al, PLAQUE_STRING, .dump_string |
mcOnRegEqu al, PLAQUE_INSERT_DATE, .dump_date |
mcOnRegEqu al, PLAQUE_INSERT_KLRATE, .dump_klrate |
mcOnRegEqu al, PLAQUE_INSERT_LEVEL, .dump_level |
mcOnRegEqu al, PLAQUE_INSERT_NAME, .dump_captain_name |
mcOnRegEqu al, PLAQUE_INSERT_SCORE, .dump_score |
mcOnRegEqu al, PLAQUE_END_OF_LINE, .dump_CR_LF |
mcOnRegEqu al, PLAQUE_END_OF_ALL, .save |
; |
; This byte is a count of charactes defined by next byte |
; |
movzx ecx, al |
mov al, [esi + 1] |
inc [esp + loc112.pNextInByte] |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep stosb |
jmp .load_input_byte |
.dump_string: |
; |
; The next byte is a length of data to be copied |
; |
movzx ecx, byte [esi + 1] |
inc [esp + loc112.pNextInByte] |
; |
; Copy data |
; |
mcLoadLocal edi, loc112.pNextOutByte |
mcLoadLocal esi, loc112.pNextInByte |
add [esp + loc112.pNextInByte], ecx |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
jmp .load_input_byte |
.dump_date: |
mcLoadLocalRef edi, loc112.timeNow |
invoke GetLocalTime, edi |
movzx ecx, word [edi + SYSTIME.wMonth] |
add ecx, 714 |
call TMsgTable_GetItem |
call TCmdBuf_AnsiStrLen |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
mov al, ' ' |
stosb |
inc [esp + loc112.pNextOutByte] |
mcLoadLocalRef esi, loc112.timeNow |
movzx eax, word [esi + SYSTIME.wDay] |
mcLoadLocalRef edi, loc112.bufAnsiValue |
call TFormat_Int32 |
mov esi, edi |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
mov al, ',' |
stosb |
mov al, ' ' |
stosb |
add [esp + loc112.pNextOutByte], 2 |
mcLoadLocalRef esi, loc112.timeNow |
movzx eax, word [esi + SYSTIME.wYear] |
mcLoadLocalRef edi, loc112.bufAnsiValue |
call TFormat_Int32 |
mov esi, edi |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
jmp .load_input_byte |
.dump_klrate: |
mov cl, 2 |
mcLoadLocalRef edi, loc112.bufAnsiValue |
fld [glb_dbl_KlingonsPerDate] |
call TFormat_Double |
mov esi, edi |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
jmp .load_input_byte |
.dump_level: |
mcLoadGameDataPtr esi |
movzx ecx, [esi + TREKDATA.SKILL] |
add cl, 12 |
call TMsgTable_GetItem |
mcLoadLocal edi, loc112.pNextOutByte |
mcZeroBits eax |
mcZeroBits ecx |
.next_level_char: |
lodsb |
mcOnRegZero eax, .level_copied |
stosb |
inc ecx |
jmp .next_level_char |
.level_copied: |
add [esp + loc112.pNextOutByte], ecx |
jmp .load_input_byte |
.dump_captain_name: |
; |
; NSKIP = 65 - LEN (NAME)/2 |
; |
mcLoadLocalRef esi, loc112.bufAnsiKirkAlias |
call TCmdBuf_AnsiStrLen |
mcStoreLocal loc112.nLenName, ecx |
mcLoad8bitsToReg32 eax, 65 |
shr ecx, 1 |
sub eax, ecx |
mov cl, ' ' |
xchg eax, ecx |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep stosb |
mcLoadLocalRef esi, loc112.bufAnsiKirkAlias |
mcLoadLocal ecx, loc112.nLenName |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
jmp .dump_CR_LF |
.dump_score: |
mcLoadLocalRef edi, loc112.bufAnsiValue |
mov eax, [glb_Score] |
call TFormat_Int32 |
mov esi, edi |
mcLoadLocal edi, loc112.pNextOutByte |
add [esp + loc112.pNextOutByte], ecx |
rep movsb |
jmp .load_input_byte |
.dump_CR_LF: |
mcLoadLocal edi, loc112.pNextOutByte |
mov al, 0Dh |
stosb |
mov al, 0Ah |
stosb |
mcStoreLocal loc112.pNextOutByte, edi |
jmp .load_input_byte |
.save: |
invoke CreateFileAnsi, str_PlaqueFile, GENERIC_WRITE, 0, 0,\ |
CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0 |
mov ebx, eax |
mcOnRegEqu ebx, -1, .done |
mcLoadLocal esi, loc112.pAllocatedOutBuffer |
mcLoadLocalRef edi, loc112.pNextInByte |
mcLoadLocal ecx, loc112.pNextOutByte |
sub ecx, esi |
invoke WriteFile, ebx, esi, ecx, edi, 0 |
invoke CloseHandle, ebx |
call TConsole_SetGameMsgAttr |
mov cl, 3 |
call TConsole_Skip |
mov ecx, 728 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mov cl, 3 |
call TConsole_Skip |
.done: |
mcEndLocals loc112.size |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; CF = TRUE if directory has been set |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_SetLocalDir: |
mcBeginLocals 260*2 |
mov esi, esp |
invoke GetModuleFileName, 0, esi, 260 |
mcZeroBits eax |
mcZeroBits edi |
.next_char: |
lodsw |
mcOnRegZero eax, .set_dir |
cmp al, '\' |
jne .next_char |
mov edi, esi |
jmp .next_char |
.set_dir: |
mcOnRegZero edi, .failed |
stosw |
invoke SetCurrentDir, esp |
mcOnRegZero eax, .failed |
.done: |
mcEndLocals 260*2 |
stc |
ret |
.failed: |
invoke MessageBox, 0, str_SetDirFailed, str_MainWndTitle, 10h |
mcEndLocals 260*2 |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = HDC |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc1: |
.hDC HDC ? |
.hMemDC HDC ? |
.hSurfaceBmp HBITMAP ? |
.hDefaultBmp HBITMAP ? |
.hDefaultFont HFONT ? |
.rect_Client rb RECT.size |
.bkMode INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_WmPaint: |
mcBeginLocals loc1.size |
mcStoreLocal loc1.hDC, eax |
mcLoadLocalRef edi, loc1.rect_Client |
invoke GetClientRect, [glb_MainWnd], edi |
mcLoadLocal edx, loc1.hDC |
invoke CreateCompatibleDC, edx |
mcStoreLocal loc1.hMemDC, eax |
mov ebx, esp |
invoke CreateCompatibleBitmap, [ebx + loc1.hDC], \ |
dword [ebx + loc1.rect_Client + RECT.rc_Right], \ |
dword [ebx + loc1.rect_Client + RECT.rc_Bottom] |
mcStoreLocal loc1.hSurfaceBmp, eax |
invoke SelectObject, [ebx + loc1.hMemDC], eax |
mcStoreLocal loc1.hDefaultBmp, eax |
invoke GetStockObject, BLACK_BRUSH |
mcLoadLocalRef esi, loc1.rect_Client |
invoke FillRect, [ebx + loc1.hMemDC], esi, eax |
invoke SetBkMode, [ebx + loc1.hMemDC], TRANSPARENT |
mcStoreLocal loc1.bkMode, eax |
invoke SelectObject, [ebx + loc1.hMemDC], [glb_Font] |
mcStoreLocal loc1.hDefaultFont, eax |
mcLoadLocal edx, loc1.hMemDC |
call TConsole_DrawAllLines |
mov ebx, esp |
invoke SetBkMode, [ebx + loc1.hMemDC], [ebx + loc1.bkMode] |
invoke SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultFont] |
mcZeroBits ecx |
invoke BitBlt, [ebx + loc1.hDC], ecx, ecx, \ |
dword [ebx + loc1.rect_Client + RECT.rc_Right], \ |
dword [ebx + loc1.rect_Client + RECT.rc_Bottom], \ |
[ebx + loc1.hMemDC], ecx, ecx, SRCCOPY |
invoke SelectObject, [ebx + loc1.hMemDC], [ebx + loc1.hDefaultBmp] |
invoke DeleteObject, [ebx + loc1.hSurfaceBmp] |
invoke DeleteDC, [ebx + loc1.hMemDC] |
mcEndLocals loc1.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = WCHAR received from user |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_WmChar: |
and eax, 0FFh |
cmp al, 20h |
jb .control_char |
cmp al, 'a' |
jb .draw_symbol |
cmp al, 'z' |
ja .draw_symbol |
sub al, 20h |
.draw_symbol: |
mov cl, ATTR_PROMPT_VALUE |
call TConsole_SetAttr |
call TCmdBuf_PutChar |
call TConsole_PutChar |
call TConsole_RefreshCaretLine |
ret |
.backspace: |
call TCmdBuf_IsEmpty |
jnc .del_last_char |
ret |
.del_last_char: |
call TCmdBuf_Backspace |
call TConsole_Backspace |
ret |
.command_complete: |
call TConsole_ScrollUp |
call TCmdBuf_Parse |
lock inc [glb_GameThreadBusy] |
ret |
.key_escape: |
ret |
.control_char: |
cmp al, CHAR_BACKSPACE |
je .backspace |
cmp al, CHAR_ENTER |
je .command_complete |
cmp al, CHAR_ESC |
je .key_escape |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_QueryTextSize: |
invoke GetDC, 0 |
mov esi, eax |
invoke SelectObject, eax, [glb_Font] |
push eax |
invoke GetTextExtentPoint32, esi, str_CharSizeText, 2, glb_CharSize |
pop edx |
invoke SelectObject, esi, edx |
invoke ReleaseDC, 0, esi |
shr dword [glb_CharSize + SIZE.size_Width], 1 |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = address of rectangle to redraw |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_RefreshMainWndRect: |
mov ebx, [glb_MainWnd] |
invoke InvalidateRect, ebx, esi, 1 |
invoke UpdateWindow, ebx |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_AdjustWndRect: |
mcBeginLocals RECT.size |
mov esi, esp |
mcZeroBits eax |
mov [esi + RECT.rc_Left], eax |
mov [esi + RECT.rc_Top], eax |
mov ecx, dword [glb_CharSize + SIZE.size_Width] |
imul ecx, CONSOLE_COLS |
add ecx, 2 |
mov [esi + RECT.rc_Right], ecx |
mov ecx, dword [glb_CharSize + SIZE.size_Height] |
imul ecx, CONSOLE_ROWS |
add ecx, 2 |
mov [esi + RECT.rc_Bottom], ecx |
invoke OffsetRect, esi, 200, 32 |
invoke AdjustWindowRect, esi, WS_NOSIZEWND, 0 |
mcRectWidth ecx, esi |
mcRectHeight edx, esi |
invoke MoveWindow, [glb_MainWnd], \ |
[esi + RECT.rc_Left], \ |
[esi + RECT.rc_Top], \ |
ecx, edx, 0 |
mcEndLocals RECT.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_WmCreate: |
call TCommon_Allocate |
call TMsgTable_Load |
call TCmdBuf_Create |
call TApp_QueryTextSize |
call TApp_AdjustWndRect |
invoke PostMessage, [glb_MainWnd], WM_CUSTOM_DO_PRELIM, 0, 0 |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; hWnd, uiMsg, WParam, LParam |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_WndProc: |
mcProlog |
mov eax, uiMsg |
mcOnRegEqu eax, WM_CREATE, .OnCreate |
mcOnRegEqu eax, WM_DESTROY, .OnDestroy |
mcOnRegEqu eax, WM_ERASEBKGND, .OnEraseBkGnd |
mcOnRegEqu eax, WM_PAINT, .OnPaint |
mcOnRegEqu eax, WM_CHAR, .OnChar |
mcOnRegEqu eax, WM_CUSTOM_DO_PRELIM, .StartGameThread |
invoke DefWindowProc, hWnd, uiMsg, WParam, LParam |
.exit: |
mcEpilog |
ret 10h |
.StartGameThread: |
invoke CreateThread, 0, 0, TGame_Thread, 0, 0, 0 |
.ret_zero: |
mcZeroBits eax |
jmp .exit |
.OnCreate: |
mov eax, hWnd |
mov [glb_MainWnd], eax |
call TApp_WmCreate |
jmp .ret_zero |
.OnDestroy: |
invoke PostQuitMessage, 0 |
jmp .ret_zero |
.OnEraseBkGnd: |
mcLoad1 eax |
jmp .exit |
.OnPaint: |
mcBeginLocals PAINTSTRUCT.size |
invoke BeginPaint, [glb_MainWnd], esp |
call TApp_WmPaint |
invoke EndPaint, [glb_MainWnd], esp |
mcEndLocals PAINTSTRUCT.size |
jmp .ret_zero |
.OnChar: |
mcZeroBits eax |
lock add [glb_GameThreadBusy], eax |
jnz .ret_zero |
mov eax, WParam |
call TApp_WmChar |
jmp .ret_zero |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_CreateFont: |
mcBeginLocals LOGFONT.size |
mov edi, esp |
mov ecx, LOGFONT.size |
mcZeroBits eax |
rep stosb |
mov edx, FW_NORMAL |
mov [esp + LOGFONT.lf_Weight], edx |
mov dl, DEFAULT_CHARSET |
mov [esp + LOGFONT.lf_CharSet], dl |
lea edi, [esp + LOGFONT.lf_FaceName] |
mov esi, str_FontFace |
call TString_Copy |
invoke GetDC, 0 |
mov esi, eax |
invoke GetDeviceCaps, esi, LOGPIXELSY |
invoke MulDiv, 12, eax, 72 |
neg eax |
mov [esp + LOGFONT.lf_Height], eax |
invoke ReleaseDC, 0, esi |
invoke CreateFontIndirect, esp |
mov [glb_Font], eax |
mcEndLocals LOGFONT.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_RegisterWnd: |
mcBeginLocals WNDCLASS.size |
mov ebx, esp |
mcZeroBits ecx |
mcStoreMember WNDCLASS.wc_lpszMenuName, ecx |
mcStoreMember WNDCLASS.wc_cbClsExtra, ecx |
mcStoreMember WNDCLASS.wc_cbWndExtra, ecx |
mcStoreMember WNDCLASS.wc_hbrBackground, ecx |
invoke LoadCursor, 0, IDC_ARROW |
mcStoreMember WNDCLASS.wc_hCursor, eax |
invoke LoadIcon, 0, IDI_EXCLAMATION |
mcStoreMember WNDCLASS.wc_hIcon, eax |
mov eax, [glb_Instance] |
mcStoreMember WNDCLASS.wc_hInstance, eax |
mov eax, TApp_WndProc |
mcStoreMember WNDCLASS.wc_lpfnWndProc, eax |
mov eax, str_MainWndClass |
mcStoreMember WNDCLASS.wc_lpszClassName, eax |
invoke RegisterClass, ebx |
mcEndLocals WNDCLASS.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_CreateMainWnd: |
invoke CreateWindowEx, WS_EX_APPWINDOW, str_MainWndClass, \ |
str_MainWndTitle, WS_NOSIZEWND, \ |
80, 40, 500, 500, \ |
0, 0, [glb_Instance], 0 |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_Init: |
invoke GetModuleHandle, 0 |
mov [glb_Instance], eax |
invoke HeapCreate, HEAP_NO_SERIALIZE, 0x20000, 0 |
mov [glb_Allocator], eax |
call TRandom_Create |
call TApp_RegisterWnd |
call TApp_CreateFont |
call TApp_CreateMainWnd |
call TConsole_Create |
call TLog_Create |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TApp_Run: |
mcBeginLocals MSG.size |
mov esi, [glb_MainWnd] |
invoke ShowWindow, esi, SW_SHOWNORMAL |
invoke UpdateWindow, esi |
@@: |
mcZeroBits eax |
mov edi, esp |
invoke GetMessage, edi, eax, eax, eax |
mcOnRegZero eax, .done |
invoke TranslateMessage, edi |
invoke DispatchMessage, edi |
jmp @r |
.done: |
call TLog_Disable |
mcEndLocals MSG.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TArray.Asm |
---|
0,0 → 1,677 |
; -------------------------------------------------------------------------- |
; FILE: TArray.Asm |
; DATE: October 4, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; LEAVE |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index (IESC) of the leaving enemy |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_Leave: |
pushad |
mcLoadGameDataPtr ebx |
movzx edx, [ebx + TREKDATA.NENHERE] |
dec edx |
dec ecx |
mcLoadMemberRef edi, TREKDATA.KX |
mov al, [edi + edx] |
mov [edi + ecx], al |
mcLoadMemberRef edi, TREKDATA.KY |
mov al, [edi + edx] |
mov [edi + ecx], al |
imul ecx, 10 |
imul edx, 10 |
mcLoadMemberRef edi, TREKDATA.KPOWER |
fld tbyte [edi + edx] |
fstp tbyte [edi + ecx] |
mcLoadMemberRef edi, TREKDATA.KDIST |
fld tbyte [edi + edx] |
fstp tbyte [edi + ecx] |
dec [ebx + TREKDATA.KLHERE] |
dec [ebx + TREKDATA.NENHERE] |
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
je .done |
call TCommon_NewCondition |
.done: |
popad |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDI = array relative offset |
; ECX = 1-based index of DOUBLE cell |
; ST(0) = value to store |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetDouble: |
push eax ecx |
movzx ecx, cl |
dec ecx |
imul ecx, 10 |
mcLoadGameDataPtr eax |
add edi, eax |
fstp tbyte [edi + ecx] |
pop ecx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = 1-based index of KPOWER cell |
; Output: |
; EDX = address of that DOUBLE cell |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_KlingonPowerPtr: |
push ecx |
movzx ecx, cl |
mcLoadGameDataPtr edx |
add edx, TREKDATA.KPOWER |
dec ecx |
imul ecx, 10 |
add edx, ecx |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDI = array relative offset |
; CL = 1-based index of DOUBLE cell |
; Output: |
; ST(0) = loaded value |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetDouble: |
push eax ecx |
movzx ecx, cl |
dec ecx |
imul ecx, 10 |
mcLoadGameDataPtr eax |
add edi, eax |
fld tbyte [edi + ecx] |
pop ecx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = 1-based index of DAMAGE cell |
; Output: |
; ST(0) = loaded value |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetDblDamage: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.DAMAGE |
call TArray_GetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = 1-based index of DEVICE |
; Output: |
; CF=1 if device is damaged |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_IsDamaged: |
call TArray_GetDblDamage |
fldz |
mc_CMP_ST0_ST1 |
jz .no_damage |
stc |
ret |
.no_damage: |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index of KPOWER cell |
; Output: |
; ST(0) = loaded value |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetDblKPower: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.KPOWER |
call TArray_GetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index of KDIST cell |
; Output: |
; ST(0) = loaded value |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetDblKDist: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.KDIST |
call TArray_GetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index of DAMAGE cell |
; ST(0) = value to store |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetDblDamage: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.DAMAGE |
call TArray_SetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index of KPOWER cell |
; ST(0) = value to store |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetDblKPower: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.KPOWER |
call TArray_SetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = 1-based index of KDIST cell |
; ST(0) = value to store |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetDblKDist: |
push edi |
mcLoad8bitsToReg32 edi, TREKDATA.KDIST |
call TArray_SetDouble |
pop edi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..10] |
; DL = Y coordinate in range [1..10] |
; Output: |
; EBX = address of QUAD (X,Y) |
; NOTE: |
; Coordinates are preserved during the call |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_QuadPtr: |
push eax ecx edx |
; |
; I = (X-1)*10 + (Y-1) |
; |
dec al |
dec dl |
cbw |
imul ax, 10 |
add al, dl |
movzx ecx, al |
; |
; Load address into EBX |
; |
mov ebx, [glb_pGameData] |
lea ebx, [ebx + ecx + TREKDATA.QUAD] |
pop edx ecx eax |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; CF=TRUE if CHAR_WEB is the only element encountered around |
; the quadrant edges. |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_IsWebComplete: |
; |
; Check the way from sector 1-1 to sector 1-10 |
; |
mcLoad1 eax |
mov edx, eax |
call TArray_QuadPtr |
mcLoad8bitsToReg32 ecx, 10 |
mov al, CHAR_WEB |
.check_1: |
cmp [ebx], al |
jne .return_false |
inc ebx |
loop .check_1 |
; |
; Check the way from sector 10-1 to sector 10-10 |
; |
mov al, 10 |
mov dl, 1 |
call TArray_QuadPtr |
mcLoad8bitsToReg32 ecx, 10 |
mov al, CHAR_WEB |
.check_2: |
cmp [ebx], al |
jne .return_false |
inc ebx |
loop .check_2 |
; |
; Check the vertical ways: |
; 1. From sector 1-1 to sector 10-1 |
; 2. From sector 1-10 to sector 10-10 |
; |
mov al, 2 |
mov dl, 1 |
call TArray_QuadPtr |
mcLoad8bitsToReg32 ecx, 8 |
mov al, CHAR_WEB |
.check_3: |
cmp [ebx], al |
jne .return_false |
cmp [ebx + 9], al |
jne .return_false |
add ebx, 10 |
loop .check_3 |
; |
; All plugged! |
; |
stc |
ret |
.return_false: |
clc |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetShip: |
mcLoadGameDataPtr ebx |
mcLoadMember al, TREKDATA.SECTX |
mcLoadMember dl, TREKDATA.SECTY |
push ebx |
call TArray_QuadPtr |
pop esi |
mov al, [esi + TREKDATA.SHIP] |
mov [ebx], al |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; ECX = index into array (NOT OFFSET) |
; NOTE: |
; Coordinates are preserved during the call |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_8x8Index: |
; |
; In STAR TREK cosmos: coordinate X is row and |
; coordinate Y is column in the matrix, so |
; index is calculated as: |
; |
; I = (X-1)*8 + (Y-1) |
; |
push eax edx |
dec al |
dec dl |
shl al, 3 |
add al, dl |
movzx ecx, al |
pop edx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; EBX = address of SCANNED (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_ScannedQuadPtr: |
push ecx |
call TArray_8x8Index |
mov ebx, [glb_pGameData] |
lea ebx, [ebx + ecx + TREKDATA.SCANNED] |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetScanned: |
push ebx |
call TArray_ScannedQuadPtr |
mov byte [ebx], 1 |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; CF=TRUE if quadrant was scanned by SRSCAN command |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_IsScanned: |
push eax |
push ebx |
call TArray_ScannedQuadPtr |
mov al, [ebx] |
pop ebx |
shr al, 1 |
pop eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; EBX = address of NEWSTUF (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_NewStufPtr: |
push ecx |
call TArray_8x8Index |
mov ebx, [glb_pGameData] |
lea ebx, [ebx + ecx + TREKDATA.NEWSTUF] |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EBX = address of NEWSTUF (QUADX,QUADY) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_MyNewStufPtr: |
push eax edx esi |
mov esi, [glb_pGameData] |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TArray_NewStufPtr |
pop esi edx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; EBX = address of GALAXY (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GalaxyPtr: |
push ecx |
call TArray_8x8Index |
mov ebx, [glb_pGameData] |
lea ebx, [ebx + ecx*4 + TREKDATA.GALAXY] |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X coordinate in range [1..8] |
; DL = quadrant Y coordinate in range [1..8] |
; ESI = TPlanet address |
; Output: |
; CF=1 if location is matching PLNETS array item |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_IsPlanetHere: |
cmp [esi + TPlanet.planet_X], al |
jne .ret_false |
cmp [esi + TPlanet.planet_Y], dl |
jne .ret_false |
stc |
ret |
.ret_false: |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X coordinate in range [1..8] |
; DL = quadrant Y coordinate in range [1..8] |
; ECX = commander index (1-based) |
; Output: |
; CF=1 if location is matching CX,CY arrays |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_IsCommanderHere: |
push ebx ecx esi edi |
mcLoadGameDataPtr ebx |
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
dec ecx |
cmp [esi + ecx], al |
jne .ret_false |
cmp [edi + ecx], dl |
jne .ret_false |
pop edi esi ecx ebx |
stc |
ret |
.ret_false: |
pop edi esi ecx ebx |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X coordinate in range [1..8] |
; DL = quadrant Y coordinate in range [1..8] |
; Output: |
; ECX = 1-based index into PLNETS array or zero |
; ESI = address of TPlanet structure |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_FindPlanet: |
mcLoadGameDataPtr ebx |
mcLoadMemberRef esi, TREKDATA.PLNETS |
mcLoad1 ecx |
.check_planet: |
call TArray_IsPlanetHere |
jc .done |
inc ecx |
cmp cl, [ebx + TREKDATA.INPLAN] |
ja .ret_false |
add esi, TPlanet.size |
jmp .check_planet |
.ret_false: |
mcZeroBits ecx |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X coordinate in range [1..8] |
; DL = quadrant Y coordinate in range [1..8] |
; Output: |
; ECX = 1-based index into CX,CY arrays or zero |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_FindCommander: |
mcLoadGameDataPtr esi |
mcLoad1 ecx |
.scan: |
call TArray_IsCommanderHere |
jc .found_it |
inc ecx |
cmp cl, [esi + TREKDATA.REMCOM] |
jbe .scan |
mcZeroBits ecx |
.found_it: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = planet index (1-based) |
; Output: |
; EDI = address of TPlanet structure |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_PlanetPtr: |
dec ecx |
mcLoadGameDataPtr edi |
imul ecx, TPlanet.size |
lea edi, [edi + ecx + TREKDATA.PLNETS] |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EBX = address of GALAXY (QUADX,QUADY) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_MyGalaxyPtr: |
push eax edx esi |
mov esi, [glb_pGameData] |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TArray_GalaxyPtr |
pop esi edx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; EBX = address of STARCH (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_StarChartPtr: |
push ecx |
call TArray_8x8Index |
mov ebx, [glb_pGameData] |
lea ebx, [ebx + ecx*4 + TREKDATA.STARCH] |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; ECX = value of STARCH (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetStarChartValue: |
push ebx |
call TArray_StarChartPtr |
mov ecx, [ebx] |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; Output: |
; ECX = value of GALAXY (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_GetGalaxyValue: |
push ebx |
call TArray_GalaxyPtr |
mov ecx, [ebx] |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; ECX = value to set at STARCH (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetStarChartValue: |
push ebx |
call TArray_StarChartPtr |
mov [ebx], ecx |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate in range [1..8] |
; DL = Y coordinate in range [1..8] |
; ECX = value to set at GALAXY (8,8) cell |
; NOTE: |
; All registers are preserved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TArray_SetGalaxyValue: |
push ebx |
call TArray_GalaxyPtr |
mov [ebx], ecx |
pop ebx |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TAttack.Asm |
---|
0,0 → 1,1813 |
; -------------------------------------------------------------------------- |
; FILE: TAttack.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; EBX = address of BYTE A |
; ECX = address of BYTE B |
; -------------------------------------------------------------------------- |
; Performs the following statement: |
; IF (2*ABS(A) < ABS (B)) A=0 |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Helper1: |
push eax edx |
movsx eax, byte [ebx] |
call TCommon_AbsEAX |
lea edx, [eax + eax] |
movsx eax, byte [ecx] |
call TCommon_AbsEAX |
cmp edx, eax |
jnb .done |
.apply_zero: |
mov byte [ebx], 0 |
.done: |
pop edx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EBX = address of BYTE A |
; EAX = value of MOTION |
; -------------------------------------------------------------------------- |
; Performs the following statement: |
; IF (A != 0) A = ISIGN (1, MOTION*A) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Helper2: |
cmp byte [ebx], 0 |
jne .get_sign |
ret |
.get_sign: |
push eax ecx |
movsx ecx, byte [ebx] |
imul ecx, eax |
mcLoad1 eax |
call TAttack_ISign |
mov [ebx], al |
pop ecx eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; BL = QUAD |
; AL = LOOK |
; Output: |
; AL = QUAD + (LOOK+9)/10 - 1 |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Helper3: |
add al, 9 |
movzx eax, al |
mcLoad8bitsToReg32 ecx, 10 |
mcZeroBits edx |
div ecx |
add al, bl |
dec al |
ret |
; -------------------------------------------------------------------------- |
; ISIGN |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = Int32 value |
; ECX = any signed value |
; Output: |
; EAX = same value with a sign of value in ECX |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_ISign: |
call TCommon_AbsEAX |
add ecx, 0 |
js .apply_negative |
ret |
.apply_negative: |
neg eax |
ret |
; -------------------------------------------------------------------------- |
; CASULTY |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = total hit incurred by the ship |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Casualties: |
call TRandom_Ranf |
fmulp |
fld [glb_dbl_0dot015] |
fmulp |
call TCommon_FP_Truncate |
cmp eax, 2 |
jb .done |
mcLoadGameDataPtr edi |
add [edi + TREKDATA.CASUAL], al |
push eax |
call TConsole_SetCrewMsgAttr |
mov ecx, 272 |
call TConsole_Cram |
pop eax |
call TConsole_CramInt |
mov ecx, 273 |
call TConsole_Prout |
call TConsole_SetGameMsgAttr |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Check in debugger if all values in KPOWER array are intact |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_DbgVerifyKPower: |
pushad |
mcLoadGameDataPtr esi |
movzx ecx, [esi + TREKDATA.NENHERE] |
lea ebx, [esi + TREKDATA.KPOWER] |
@@: |
fld tbyte [ebx] |
mcFpuPop |
add ebx, 10 |
loop @r |
popad |
ret |
; -------------------------------------------------------------------------- |
; ZAP |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = address of HIT |
; EDI = address of IHURT |
; ECX = L (1-based klingon index) |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc37: |
.pTrekData PVOID ? |
.pIHURT PBOOL ? |
.pHIT PDOUBLE ? |
.dbl_HITSH DOUBLE ? |
.dbl_ABSORB DOUBLE ? |
.dbl_PROPOR DOUBLE ? |
.dbl_CHGFAC DOUBLE ? |
.dbl_EXTRADM DOUBLE ? |
.dbl_PFAC DOUBLE ? |
.nCRIT COUNT ? |
.nKTR COUNT ? |
.nJ INDEX ? |
.nL INDEX ? |
.nLL INDEX ? |
.arrCDAM BYTES 8 |
.nCDAM COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Zap: |
mcBeginLocals loc37.size |
mcStoreLocal loc37.pHIT, esi |
mcStoreLocal loc37.pIHURT, edi |
mcStoreLocal loc37.nL, ecx |
mcLoadGameDataPtr ebx |
mcStoreLocal loc37.pTrekData, ebx |
fld1 |
fld [ebx + TREKDATA.INSHLD] |
fdivp |
fstp [esp + loc37.dbl_PFAC] |
fld1 |
fstp [esp + loc37.dbl_CHGFAC] |
cmp [ebx + TREKDATA.SHLDCHG], 0 |
je .check_defenses |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
fmulp |
fld [glb_dbl_DOCKFAC] ; Reusing 0.25 |
faddp |
fstp [esp + loc37.dbl_CHGFAC] |
.check_defenses: |
cmp [ebx + TREKDATA.SHLDUP], 0 |
jne .reduce_hit |
cmp [ebx + TREKDATA.SHLDCHG], 0 |
je .L10 |
.reduce_hit: |
fld [ebx + TREKDATA.SHLD] |
fld [esp + loc37.dbl_PFAC] |
fmulp |
fld [glb_dbl_0dot1] |
call TCommon_FPU_Max |
fld st |
fstp [esp + loc37.dbl_PROPOR] |
fld [esp + loc37.dbl_CHGFAC] |
fmulp |
mcLoadLocal esi, loc37.pHIT |
fld tbyte [esi] |
fmulp |
fld1 |
faddp |
fld st |
fstp [esp + loc37.dbl_HITSH] |
fld [glb_dbl_0dot8] |
fmulp |
fstp [esp + loc37.dbl_ABSORB] |
fld [ebx + TREKDATA.SHLD] |
fld [esp + loc37.dbl_ABSORB] |
mc_CMP_ST0_ST1 |
jc .reduce_shields |
fld [ebx + TREKDATA.SHLD] |
fstp [esp + loc37.dbl_ABSORB] |
.reduce_shields: |
fld [ebx + TREKDATA.SHLD] |
fld [esp + loc37.dbl_ABSORB] |
fsubp |
fld st |
fstp [ebx + TREKDATA.SHLD] |
fldz |
mc_CMP_ST0_ST1 |
jc .reduce_hit2 |
mov [ebx + TREKDATA.SHLDUP], 0 |
.reduce_hit2: |
mcLoadLocal edi, loc37.pHIT |
fld tbyte [edi] |
fld [esp + loc37.dbl_HITSH] |
fsubp |
fstp tbyte [edi] |
fld [esp + loc37.dbl_PROPOR] |
fld [glb_dbl_0dot1] |
mc_CMP_ST0_ST1 |
jz .L10 |
fld [ebx + TREKDATA.ENERGY] |
fld [glb_dbl_0dot005] |
fmulp |
fld tbyte [edi] |
mc_CMP_ST0_ST1 |
jc .done |
.L10: |
; |
; We've been hit!! |
; |
mcLoadLocal edi, loc37.pIHURT |
inc dword [edi] |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mov dl, 8 |
mcLoadLocal esi, loc37.pHIT |
fld tbyte [esi] |
call TConsole_CramFloatWidth |
mcLoad8bitsToReg32 ecx, 254 |
call TConsole_Cram |
cmp [esp + loc37.nL], 0 |
je .L15 |
mcLoad8bitsToReg32 ecx, 255 |
call TConsole_Cram |
mcLoadLocal ebx, loc37.pTrekData |
mcLoadLocal ecx, loc37.nL |
dec ecx |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
call TConsole_CramEnemyAtEx |
.L15: |
call TConsole_ScrollUp |
invoke Sleep, 350 |
; |
; Decide if hit is critical |
; |
mcLoadLocal ebx, loc37.pTrekData |
mov eax, 275 |
movzx ecx, [ebx + TREKDATA.SKILL] |
imul ecx, 25 |
sub eax, ecx |
push eax |
call TRandom_Ranf |
pop eax |
fld [glb_dbl_0dot5] |
fmulp |
fld1 |
faddp |
call TCommon_FPU_Load_EAX |
fmulp |
mcLoadLocal esi, loc37.pHIT |
fld tbyte [esi] |
mc_CMP_ST0_ST1 |
jc .L60 |
call TRandom_Ranf |
fld [glb_dbl_100] |
fmulp |
fld [glb_dbl_500] |
faddp |
mcLoadLocal esi, loc37.pHIT |
fld tbyte [esi] |
fdivrp |
fld1 |
faddp |
call TCommon_FP_Truncate |
mcStoreLocal loc37.nCRIT, eax |
call TConsole_SetGameMsgAttr |
mov ecx, 256 |
call TConsole_Cram |
; |
; Select devices and cause damage |
; |
mcLoad1 eax |
mcStoreLocal loc37.nKTR, eax |
mcStoreLocal loc37.nLL, eax |
dec eax |
mcStoreLocal loc37.nCDAM, eax |
.L20: |
mcLoad8bitsToReg32 edx, 13 |
call TRandom_IRan |
inc eax |
mov ecx, eax |
mcStoreLocal loc37.nJ, eax |
call TArray_GetDblDamage |
fldz |
fxch |
mc_CMP_ST0_ST1 |
jc .L20 |
; |
; Prevent shuttle damage unless on ship |
; |
cmp [esp + loc37.nJ], 10 |
jne .calculate_damage |
mcLoadLocal esi, loc37.pTrekData |
cmp [esi + TREKDATA.ISCRAFT], 1 |
jne .L20 |
.calculate_damage: |
mcLoadLocal ecx, loc37.nCDAM |
mcLoadLocalRef edi, loc37.arrCDAM |
inc [esp + loc37.nCDAM] |
mcLoadLocal eax, loc37.nJ |
mov [edi + ecx], al |
call TRandom_Ranf |
fld [glb_dbl_25] |
fmulp |
fld [glb_dbl_75] |
faddp |
fild [esp + loc37.nCRIT] |
fmulp |
mcLoadLocal esi, loc37.pTrekData |
mcLoadLocal ebx, loc37.pHIT |
fld [esi + TREKDATA.DAMFAC] |
fld tbyte [ebx] |
fmulp |
fdivrp |
fstp [esp + loc37.dbl_EXTRADM] |
mcLoadLocal ecx, loc37.nJ |
call TArray_GetDblDamage |
fld [esp + loc37.dbl_EXTRADM] |
faddp |
mcLoadLocal ecx, loc37.nJ |
call TArray_SetDblDamage |
cmp [esp + loc37.nLL], 1 |
je .L40 |
; |
; Check if device has been reported once |
; |
mcLoadLocal ecx, loc37.nCDAM |
mcLoadLocal edx, loc37.nJ |
mcLoadLocalRef esi, loc37.arrCDAM |
.check_if_reported: |
lodsb |
cmp al, dl |
je .L50 |
loop .check_if_reported |
; |
; Report the device |
; |
inc [esp + loc37.nKTR] |
cmp [esp + loc37.nKTR], 3 |
jne .cram_AND |
call TConsole_ScrollUp |
.cram_AND: |
mov ecx, 258 |
call TConsole_Cram |
.L40: |
mcLoadLocal ecx, loc37.nJ |
call TConsole_CramDevice |
.L50: |
inc [esp + loc37.nLL] |
mcLoadLocal ecx, loc37.nLL |
cmp ecx, [esp + loc37.nCRIT] |
jbe .L20 |
mov ecx, 259 |
call TConsole_Prout |
; |
; Print message if shields got knocked down |
; |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jnc .L60 |
mcLoadLocal esi, loc37.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L60 |
dec [esi + TREKDATA.SHLDUP] |
mov ecx, 260 |
call TConsole_Prout |
.L60: |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jnc .deplete |
mcLoadLocal edi, loc37.pTrekData |
mov [edi + TREKDATA.ISUBDAM], 1 |
.deplete: |
mcLoadLocal edi, loc37.pTrekData |
mcLoadLocal esi, loc37.pHIT |
fld [edi + TREKDATA.ENERGY] |
fld tbyte [esi] |
fsubp |
fstp [edi + TREKDATA.ENERGY] |
.done: |
mcEndLocals loc37.size |
ret |
; -------------------------------------------------------------------------- |
; MOVECOM |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc52: |
.pTrekData PVOID ? |
.pNOEXIT PVOID ? |
.pKDIST PDOUBLE ? |
.pKPOWER PDOUBLE ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.nLOCCOM INDEX ? |
.nI INDEX ? |
.nLL INDEX ? |
.nSTEPS COUNT ? |
.bIRUN BYTE ? |
.chIENM BYTE ? |
.nKRAWLX BYTE ? |
.nKRAWLY BYTE ? |
.nIX BYTE ? |
.nIY BYTE ? |
.nCOMX BYTE ? |
.nCOMY BYTE ? |
.nMX BYTE ? |
.nMY BYTE ? |
.nNEXTX BYTE ? |
.nNEXTY BYTE ? |
.nLOOKX BYTE ? |
.nLOOKY BYTE ? |
.nIQX BYTE ? |
.nIQY BYTE ? |
.chIQUAD BYTE ? |
.pad_1 BYTE ? |
.pad_2 BYTE ? |
.pad_3 BYTE ? |
.nMOTION INT32 ? |
.dbl_TFAC DOUBLE ? |
.dbl_EFAC DOUBLE ? |
.dbl_MDIST DOUBLE ? |
.dbl_DIST1 DOUBLE ? |
.dbl_NBADDYS DOUBLE ? |
.dbl_FORCES DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_MoveCommanders: |
mcBeginLocals loc52.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc52.pTrekData, esi |
lea eax, [esi + TREKDATA.KPOWER] |
lea edx, [esi + TREKDATA.KDIST] |
lea ebx, [esi + TREKDATA.KX] |
lea ecx, [esi + TREKDATA.KY] |
mcStoreLocal loc52.pKPOWER, eax |
mcStoreLocal loc52.pKDIST, edx |
mcStoreLocal loc52.pKX, ebx |
mcStoreLocal loc52.pKY, ecx |
mov al, 1 |
mcStoreLocal loc52.nKRAWLX, al |
mcStoreLocal loc52.nKRAWLY, al |
; |
; IF ((NENHERE == 0) OR (JUSTIN == 1)) RETURN |
; |
cmp [esi + TREKDATA.NENHERE], 0 |
je .done |
cmp [esi + TREKDATA.JUSTIN], al |
je .done |
; |
; NBADDYS = COMHERE + ISHERE |
; |
mov al, [esi + TREKDATA.COMHERE] |
add al, [esi + TREKDATA.ISHERE] |
call TCommon_LoadByteIntoFPU |
fstp [esp + loc52.dbl_NBADDYS] |
; |
; IF (KSTUF5 != 0) |
; NBADDYS = ((2*COMHERE)+(2*ISHERE)+(KLHERE*1.23)+(IRHERE*1.5))/2 |
; |
cmp [esi + TREKDATA.KSTUF5], 0 |
je .begin_loop |
mov al, [esi + TREKDATA.COMHERE] |
add al, al |
mov cl, [esi + TREKDATA.ISHERE] |
add cl, cl |
add al, cl |
call TCommon_LoadByteIntoFPU |
mov al, [esi + TREKDATA.KLHERE] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_1dot23] |
fmulp |
faddp |
mov al, [esi + TREKDATA.IRHERE] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_1dot5] |
fmulp |
faddp |
fld [glb_dbl_2] |
fdivp |
fstp [esp + loc52.dbl_NBADDYS] |
.begin_loop: |
mcLoad1 eax |
mcStoreLocal loc52.nI, eax |
.L1: |
mov [esp + loc52.bIRUN], 0 |
; |
; IX = KX (I) |
; IY = KY (I) |
; |
mcLoadLocal ecx, loc52.nI |
mcStoreLocal loc52.nLOCCOM, ecx |
dec ecx |
mcLoadLocal esi, loc52.pKX |
mcLoadLocal edi, loc52.pKY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcStoreLocal loc52.nIX, al |
mcStoreLocal loc52.nIY, dl |
mcStoreLocal loc52.nCOMX, al |
mcStoreLocal loc52.nCOMY, dl |
; |
; IENM = QUAD (IX,IY) |
; |
call TArray_QuadPtr |
mov al, [ebx] |
mcStoreLocal loc52.chIENM, al |
; |
; IF (KSTUF5==0) AND ((IENM != 'S') OR (IENM != 'C')) GOTO 500 |
; |
mcLoadLocal esi, loc52.pTrekData |
cmp [esi + TREKDATA.KSTUF5], 0 |
jne .check_if_scom |
cmp [esp + loc52.chIENM], CHAR_SCOM |
jne .L500 |
cmp [esp + loc52.chIENM], CHAR_COMMANDER |
jne .L500 |
.check_if_scom: |
; |
; IF (IENM != 'S') GOTO 3 |
; |
cmp [esp + loc52.chIENM], CHAR_SCOM |
jne .L3 |
; |
; Check with spy to see if S.C. should hi-tail it |
; IF (KPOWER (LOCCOM) > 500.0) AND (!DOCKED OR TUBES DAMAGED) GOTO 3 |
; |
mcLoadLocal ecx, loc52.nLOCCOM |
mcLoadLocal ebx, loc52.pKPOWER |
dec ecx |
imul ecx, 10 |
fld [glb_dbl_500] |
fld tbyte [ebx + ecx] |
mc_CMP_ST0_ST1 |
jc .enemy_runs |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L3 |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
jc .L3 |
.enemy_runs: |
inc [esp + loc52.bIRUN] |
mcLoad8bitsToReg32 eax, -10 |
mcStoreLocal loc52.nMOTION, eax |
jmp .L8 |
.L3: |
; |
; Decide whether to advance, retreat or hold position |
; and by how much |
; |
mcZeroBits eax |
mcStoreLocal loc52.nMOTION, eax |
; |
; DIST1 = KDIST (LOCCOM) |
; |
mcLoadLocal ecx, loc52.nLOCCOM |
mcLoadLocal ebx, loc52.pKDIST |
dec ecx |
imul ecx, 10 |
fld tbyte [ebx + ecx] |
fstp [esp + loc52.dbl_DIST1] |
; |
; MDIST = DIST1 + 0.5 |
; |
fld [esp + loc52.dbl_DIST1] |
fld [glb_dbl_0dot5] |
faddp |
fstp [esp + loc52.dbl_MDIST] |
; |
; FORCES = KPOWER (LOCCOM) + NENHERE*100.0 + (NBADDYS-1.0)*400.0 |
; |
mcLoadLocal ecx, loc52.nLOCCOM |
mcLoadLocal ebx, loc52.pKPOWER |
dec ecx |
imul ecx, 10 |
fld tbyte [ebx + ecx] |
mcLoadLocal esi, loc52.pTrekData |
mov al, [esi + TREKDATA.NENHERE] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_100] |
fmulp |
faddp |
fld [esp + loc52.dbl_NBADDYS] |
fld1 |
fsubp |
fld [glb_dbl_400] |
fmulp |
faddp |
fstp [esp + loc52.dbl_FORCES] |
; |
; IF (SHLDUP == 0) FORCES += 1000.0 |
; |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne .check_damages |
fld [esp + loc52.dbl_FORCES] |
fld [glb_dbl_1000] |
faddp |
fstp [esp + loc52.dbl_FORCES] |
.check_damages: |
; |
; IF ((DAMAGE (3) == 0) OR (DAMAGE (4) == 0)) GOTO 4 |
; |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
jnc .L4 |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
jnc .L4 |
; |
; FORCES += 1000.0 |
; |
fld [esp + loc52.dbl_FORCES] |
fld [glb_dbl_1000] |
faddp |
fstp [esp + loc52.dbl_FORCES] |
jmp .L7 |
.L4: |
fld1 |
fld1 |
fstp [esp + loc52.dbl_EFAC] |
fstp [esp + loc52.dbl_TFAC] |
; |
; IF (DAMAGE (3) == 0) GOTO 5 |
; |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
jnc .L5 |
; |
; EFAC = 0.0 |
; FORCES += 300.0 |
; |
fldz |
fstp [esp + loc52.dbl_EFAC] |
fld [esp + loc52.dbl_FORCES] |
fld [glb_dbl_300] |
faddp |
fstp [esp + loc52.dbl_FORCES] |
.L5: |
; |
; IF (DAMAGE (4) == 0) GOTO 6 |
; |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
jnc .L6 |
; |
; TFAC = 0.0 |
; FORCES += 300.0 |
; |
fldz |
fstp [esp + loc52.dbl_TFAC] |
fld [esp + loc52.dbl_FORCES] |
fld [glb_dbl_300] |
faddp |
fstp [esp + loc52.dbl_FORCES] |
.L6: |
; |
; FORCES = FORCES - 50.0*TORPS*TFAC + 0.2*EFAC*(2500.0-ENERGY) + 0.6*SHLDUP*(1250.0-SHLD) |
; |
fld [esp + loc52.dbl_FORCES] |
mcLoadLocal esi, loc52.pTrekData |
movzx eax, [esi + TREKDATA.TORPS] |
imul eax, 50 |
call TCommon_FPU_Load_EAX |
fld [esp + loc52.dbl_TFAC] |
fmulp |
fsubp |
fld [glb_dbl_2500] |
fld [esi + TREKDATA.ENERGY] |
fsubp |
fld [esp + loc52.dbl_EFAC] |
fmulp |
fld [glb_dbl_0dot2] |
fmulp |
faddp |
fld [glb_dbl_1250] |
fld [esi + TREKDATA.SHLD] |
fsubp |
fld [glb_dbl_0dot6] |
fmulp |
mov al, [esi + TREKDATA.SHLDUP] |
call TCommon_LoadByteIntoFPU |
fmulp |
faddp |
fstp [esp + loc52.dbl_FORCES] |
.L7: |
; |
; IF (FORCES > 1000.0) MOTION = (1.0-RANF(0)**2)*DIST1 + 1.0 |
; |
fld [glb_dbl_1000] |
fld [esp + loc52.dbl_FORCES] |
mc_CMP_ST0_ST1 |
jc .check_docked |
fld1 |
call TRandom_Ranf |
fld st |
fmulp |
fsubp |
fld [esp + loc52.dbl_DIST1] |
fmulp |
fld1 |
faddp |
call TCommon_FP_Truncate |
mcStoreLocal loc52.nMOTION, eax |
.check_docked: |
; |
; IF (DOCKED) MOTION -= SKILL*(2.0-RANF(0)**2) |
; |
mcLoadLocal esi, loc52.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .check_no_motion |
fld [glb_dbl_2] |
call TRandom_Ranf |
fld st |
fmulp |
fsubp |
mov al, [esi + TREKDATA.SKILL] |
call TCommon_LoadByteIntoFPU |
fmulp |
call TCommon_FP_Truncate |
sub [esp + loc52.nMOTION], eax |
.check_no_motion: |
; |
; IF (MOTION == 0) MOTION = ((FORCES + 200.0*RANF(0))/150.0) - 5.0 |
; |
cmp [esp + loc52.nMOTION], 0 |
jne .we_have_motion |
call TRandom_Ranf |
fld [glb_dbl_200] |
fmulp |
fld [esp + loc52.dbl_FORCES] |
faddp |
fld [glb_dbl_150] |
fdivp |
call TCommon_FP_Truncate |
sub eax, 5 |
mcStoreLocal loc52.nMOTION, eax |
mcOnRegZero eax, .L500 |
.we_have_motion: |
; |
; IF (ABS (MOTION) > SKILL) MOTION = ISIGN (SKILL, MOTION) |
; |
mcLoadLocal eax, loc52.nMOTION |
call TCommon_AbsEAX |
mcLoadLocal esi, loc52.pTrekData |
movzx ecx, [esi + TREKDATA.SKILL] |
cmp eax, ecx |
jbe .L8 |
xchg eax, ecx |
call TAttack_ISign |
mcStoreLocal loc52.nMOTION, eax |
.L8: |
; |
; Calculate preferred number of steps to |
; move a commander. |
; |
mcLoadLocal eax, loc52.nMOTION |
call TCommon_AbsEAX |
mcStoreLocal loc52.nSTEPS, eax |
; |
; IF (MOTION > 0) AND (NSTEPS > MDIST) NSTEPS=MDIST |
; |
cmp [esp + loc52.nMOTION], 0 |
jle .validate_step_count |
fld [esp + loc52.dbl_MDIST] |
call TCommon_FP_Truncate |
cmp [esp + loc52.nSTEPS], eax |
jle .validate_step_count |
mcStoreLocal loc52.nSTEPS, eax |
.validate_step_count: |
cmp [esp + loc52.nSTEPS], 1 |
jb .set_one_step |
cmp [esp + loc52.nSTEPS], 10 |
jbe .compute_dx_dy |
push 10 |
jmp .apply_num_steps |
.set_one_step: |
push 1 |
.apply_num_steps: |
pop eax |
mcStoreLocal loc52.nSTEPS, eax |
.compute_dx_dy: |
; |
; Compute preferred values of Delta X and Delta Y |
; MX = SECTX - COMX |
; MY = SECTY - COMY |
; |
mcLoadLocal esi, loc52.pTrekData |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
sub al, [esp + loc52.nCOMX] |
sub dl, [esp + loc52.nCOMY] |
mcStoreLocal loc52.nMX, al |
mcStoreLocal loc52.nMY, dl |
; |
; IF (2*ABS(MX) < ABS(MY)) MX=0 |
; IF (2*ABS(MY) < ABS(MX)) MY=0 |
; |
mcLoadLocalRef ebx, loc52.nMX |
mcLoadLocalRef ecx, loc52.nMY |
call TAttack_Helper1 |
xchg ebx, ecx |
call TAttack_Helper1 |
; |
; IF (MX != 0) MX = ISIGN (1, MX*MOTION) |
; IF (MY != 0) MY = ISIGN (1, MY*MOTION) |
; |
mcLoadLocalRef ebx, loc52.nMX |
mcLoadLocal eax, loc52.nMOTION |
call TAttack_Helper2 |
mcLoadLocalRef ebx, loc52.nMY |
call TAttack_Helper2 |
; |
; Main loop to attempt to move COMMANDER <STEPS> steps |
; NEXTX = COMX |
; NEXTY = COMY |
; |
mcLoadLocal al, loc52.nCOMX |
mcLoadLocal dl, loc52.nCOMY |
mcStoreLocal loc52.nNEXTX, al |
mcStoreLocal loc52.nNEXTY, dl |
; |
; QUAD (COMX,COMY) = IHDOT |
; |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
; |
; DO 60 LL=1,NSTEPS |
; |
mcLoad1 eax |
mcStoreLocal loc52.nLL, eax |
.look_next: |
; |
; LOOKX = NEXTX + MX |
; LOOKY = NEXTY + MY |
; |
mcLoadLocal al, loc52.nNEXTX |
mcLoadLocal dl, loc52.nNEXTY |
add al, [esp + loc52.nMX] |
add dl, [esp + loc52.nMY] |
mcStoreLocal loc52.nLOOKX, al |
mcStoreLocal loc52.nLOOKY, dl |
mov ecx, .L10 |
mcStoreLocal loc52.pNOEXIT, ecx |
; |
; IF (LOOKX < 1) OR (LOOKX > 10) IF (MOTION) 70,30,30 |
; |
cmp al, 1 |
jl .look_x_out_of_quad |
cmp al, 10 |
jg .look_x_out_of_quad |
; |
; IF (LOOKY < 1) OR (LOOKY > 10) IF (MOTION) 70,10,10 |
; |
cmp dl, 1 |
jl .look_y_out_of_quad |
cmp dl, 10 |
jg .look_y_out_of_quad |
; |
; IQUAD = QUAD (LOOKX,LOOKY) |
; |
call TArray_QuadPtr |
mov cl, [ebx] |
mcStoreLocal loc52.chIQUAD, cl |
; |
; IF (IQUAD != SHIP) GOTO 9010 |
; |
mcLoadLocal esi, loc52.pTrekData |
cmp [esi + TREKDATA.SHIP], cl |
jne .L9010 |
; |
; Only let COMMANDERS ram the ship |
; |
mcOnRegEqu cl, CHAR_COMMANDER, .whamo |
mcOnRegNotEqu cl, CHAR_SCOM, .L9010 |
.whamo: |
mov bl, 1 |
mcLoadLocal cl, loc52.chIENM |
mcLoadLocal al, loc52.nCOMX |
mcLoadLocal dl, loc52.nCOMY |
call TMove_Ram |
jmp .L500 |
.look_x_out_of_quad: |
cmp [esp + loc52.nMOTION], 0 |
jl .L70 |
jmp .L30 |
.look_y_out_of_quad: |
cmp [esp + loc52.nMOTION], 0 |
jl .L70 |
jmp .L10 |
.at_L10_out_of_quad: |
cmp [esp + loc52.nMOTION], 0 |
jl .L70 |
jmp .L20 |
.L9010: |
cmp [esp + loc52.chIQUAD], CHAR_COSMOS |
je .L50 |
.L10: |
; |
; IF (MY == KRAWLY) OR (MX == 0) GOTO 30 |
; |
mcLoadLocal al, loc52.nMY |
cmp al, [esp + loc52.nKRAWLY] |
je .L30 |
cmp [esp + loc52.nMX], 0 |
je .L30 |
; |
; LOOKY = NEXTY + KRAWLY |
; |
mcLoadLocal al, loc52.nNEXTY |
add al, [esp + loc52.nKRAWLY] |
mcStoreLocal loc52.nLOOKY, al |
mov ecx, .L20 |
mcStoreLocal loc52.pNOEXIT, ecx |
; |
; IF (LOOKY < 1) OR (LOOKY > 10) IF (MOTION) 70,20,20 |
; |
cmp al, 1 |
jl .at_L10_out_of_quad |
cmp al, 10 |
jg .at_L10_out_of_quad |
; |
; IF (LOOKX < 1) OR (LOOKX > 10) IF (MOTION) 70,20,20 |
; |
mcLoadLocal dl, loc52.nLOOKX |
cmp dl, 1 |
jl .at_L10_out_of_quad |
cmp dl, 10 |
jg .at_L10_out_of_quad |
; |
; IF (QUAD (LOOKX,LOOKY) == IHDOT) GOTO 50 |
; |
xchg edx, eax |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
je .L50 |
.L20: |
; |
; KRAWLY = -KRAWLY |
; |
neg [esp + loc52.nKRAWLY] |
.L30: |
; |
; IF (MX == KRAWLX) OR (MY == 0) GOTO 60 |
; |
mcLoadLocal al, loc52.nMX |
cmp al, [esp + loc52.nKRAWLX] |
je .L60 |
cmp [esp + loc52.nMY], 0 |
je .L60 |
; |
; LOOKX = NEXTX + KRAWLX |
; |
mcLoadLocal al, loc52.nNEXTX |
add al, [esp + loc52.nKRAWLX] |
mcStoreLocal loc52.nLOOKX, al |
mov ecx, .L40 |
mcStoreLocal loc52.pNOEXIT, ecx |
; |
; IF (LOOKX < 1) OR (LOOKX > 10) IF (MOTION) 70,40,40 |
; |
cmp al, 1 |
jl .at_L30_out_of_quad |
cmp al, 10 |
jg .at_L30_out_of_quad |
; |
; IF (LOOKY < 1) OR (LOOKY > 10) IF (MOTION) 70,40,40 |
; |
mcLoadLocal dl, loc52.nLOOKY |
cmp dl, 1 |
jl .at_L30_out_of_quad |
cmp dl, 10 |
jg .at_L30_out_of_quad |
; |
; IF (QUAD (LOOKX,LOOKY) == IHDOT) GOTO 50 |
; |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
je .L50 |
.L40: |
neg [esp + loc52.nKRAWLX] |
jmp .L60 |
.at_L30_out_of_quad: |
cmp [esp + loc52.nMOTION], 0 |
jl .L70 |
jmp .L40 |
.L50: |
; |
; NEXTX = LOOKX |
; NEXTY = LOOKY |
; |
mcLoadLocal al, loc52.nLOOKX |
mcLoadLocal dl, loc52.nLOOKY |
mcStoreLocal loc52.nNEXTX, al |
mcStoreLocal loc52.nNEXTY, dl |
.L60: |
inc [esp + loc52.nLL] |
mov ecx, [esp + loc52.nLL] |
cmp ecx, [esp + loc52.nSTEPS] |
jbe .look_next |
; |
; Put COMMANDER in new place within same quadrant |
; QUAD (NEXTX,NEXTY) = IENM |
; |
mcLoadLocal al, loc52.nNEXTX |
mcLoadLocal dl, loc52.nNEXTY |
call TArray_QuadPtr |
mcLoadLocal cl, loc52.chIENM |
mov [ebx], cl |
; |
; IF ((NEXTX == COMX) AND (NEXTY == COMY)) GOTO 500 |
; |
mcLoadLocal dl, loc52.nCOMX |
cmp [esp + loc52.nNEXTX], dl |
jne .do_reposition |
mcLoadLocal dl, loc52.nCOMY |
cmp [esp + loc52.nNEXTY], dl |
je .L500 |
.do_reposition: |
; |
; KX (LOCCOM) = NEXTX |
; KY (LOCCOM) = NEXTY |
; |
mcLoadLocal al, loc52.nNEXTX |
mcLoadLocal dl, loc52.nNEXTY |
mcLoadLocal ecx, loc52.nLOCCOM |
dec ecx |
mcLoadLocal esi, loc52.pKX |
mcLoadLocal edi, loc52.pKY |
mov [esi + ecx], al |
mov [edi + ecx], dl |
; |
; KDIST (LOCCOM) = sqrt ((SECTX-NEXTX)**2 + (SECTY-NEXTY)**2) |
; |
imul ecx, 10 |
mcLoadLocal esi, loc52.pTrekData |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
sub al, [esp + loc52.nNEXTX] |
sub dl, [esp + loc52.nNEXTY] |
movsx eax, al |
movsx edx, dl |
imul eax, eax |
imul edx, edx |
add eax, edx |
call TCommon_FPU_Load_EAX |
fsqrt |
mcLoadLocal edi, loc52.pKDIST |
fstp tbyte [edi + ecx] |
mcLoadNeg1 eax |
mcStoreLocal loc52.nMOTION, eax |
; |
; IF (KDIST (LOCCOM) < DIST1) MOTION=1 |
; |
fld [esp + loc52.dbl_DIST1] |
fld tbyte [edi + ecx] |
mc_CMP_ST0_ST1 |
jnc .advance_retreat_msg |
neg [esp + loc52.nMOTION] |
.advance_retreat_msg: |
call TConsole_SetGameMsgAttr |
call TConsole_Cram3Asterisks |
mcLoadLocal al, loc52.chIENM |
call TConsole_CramEnemy |
mcZeroBits eax |
add [esp + loc52.nMOTION], 0 |
sets al |
lea ecx, [eax + 596] |
call TConsole_Cram |
mcLoadLocal al, loc52.nNEXTX |
mcLoadLocal dl, loc52.nNEXTY |
mov cl, 2 |
call TConsole_CramLoc |
call TConsole_ScrollUp |
invoke Sleep, 350 |
jmp .L500 |
.goto_no_exit: |
jmp [esp + loc52.pNOEXIT] |
.L70: |
; |
; Try to move into adjacent quadrant, avoiding |
; negative energy barrier, supernovae and >8 Klingons. |
; |
; IQX = QUADX + (LOOKX+9)/10 - 1 |
; IQY = QUADY + (LOOKY+9)/10 - 1 |
; |
mcLoadLocal esi, loc52.pTrekData |
mov bl, [esi + TREKDATA.QUADX] |
mcLoadLocal al, loc52.nLOOKX |
call TAttack_Helper3 |
mcStoreLocal loc52.nIQX, al |
mov bl, [esi + TREKDATA.QUADY] |
mcLoadLocal al, loc52.nLOOKY |
call TAttack_Helper3 |
mcStoreLocal loc52.nIQY, al |
; |
; IF (IQX,IQY is out of galaxy) GOTO NOEXIT |
; |
cmp al, 1 |
jb .goto_no_exit |
cmp al, 8 |
ja .goto_no_exit |
mcLoadLocal dl, loc52.nIQX |
cmp dl, 1 |
jb .goto_no_exit |
cmp dl, 8 |
ja .goto_no_exit |
; |
; IF (GALAXY (IQX,IQY) > 899) GOTO NOEXIT |
; |
xchg eax, edx |
call TArray_GetGalaxyValue |
cmp ecx, 899 |
ja .goto_no_exit |
cmp [esp + loc52.bIRUN], 0 |
jne .L86 |
cmp [esp + loc52.chIENM], CHAR_SCOM |
je .L85 |
; |
; Check if quadrant IQX,IQY will be an intrusion to another COMMANDER |
; |
mcLoadLocal esi, loc52.pTrekData |
movzx ecx, [esi + TREKDATA.REMCOM] |
lea edi, [esi + TREKDATA.CY] |
add esi, TREKDATA.CX |
mcLoadLocal al, loc52.nIQX |
mcLoadLocal dl, loc52.nIQY |
.check_intrusion: |
cmp [esi], al |
jne .next_commander |
cmp [edi], dl |
je .goto_no_exit |
.next_commander: |
inc esi |
inc edi |
loop .check_intrusion |
; |
; Romulans do not leave! |
; |
cmp [esp + loc52.chIENM], CHAR_ROMULAN |
je .goto_no_exit |
; |
; Do not leave if attacking a base |
; |
mcLoadLocal esi, loc52.pTrekData |
mov al, [esi + TREKDATA.QUADX] |
cmp al, [esi + TREKDATA.BATX] |
jne .L85 |
mov al, [esi + TREKDATA.QUADY] |
cmp al, [esi + TREKDATA.BATY] |
je .goto_no_exit |
.L85: |
; |
; IF (KPOWER (LOCCOM) > 1000.0) GOTO NOEXIT |
; |
mcLoadLocal esi, loc52.pTrekData |
mcLoadLocal ecx, loc52.nLOCCOM |
lea ebx, [esi + TREKDATA.KPOWER] |
dec ecx |
imul ecx, 10 |
fld tbyte [ebx + ecx] |
fld [glb_dbl_1000] |
mc_CMP_ST0_ST1 |
jc .goto_no_exit |
.L86: |
; |
; Print escape message and bail out of quadrant! |
; |
call TConsole_SetGameMsgAttr |
call TConsole_Cram3Asterisks |
mcLoadLocal al, loc52.chIENM |
call TConsole_CramEnemy |
mov ecx, 598 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal al, loc52.nIQX |
mcLoadLocal dl, loc52.nIQY |
call TConsole_CramLoc |
mov ecx, 599 |
call TConsole_Prout |
mcLoadLocal ecx, loc52.nLOCCOM |
call TArray_Leave |
dec [esp + loc52.nI] |
; |
; Handle galaxy matrix |
; |
call TArray_MyGalaxyPtr |
sub dword [ebx], 100 |
mcLoadLocal al, loc52.nIQX |
mcLoadLocal dl, loc52.nIQY |
call TArray_GalaxyPtr |
add dword [ebx], 100 |
cmp [esp + loc52.chIENM], CHAR_COMMANDER |
je .L87 |
cmp [esp + loc52.chIENM], CHAR_SCOM |
jne .L500 |
mcLoadLocal esi, loc52.pTrekData |
mcZeroBits eax |
mov [esi + TREKDATA.ISHERE], al |
mov [esi + TREKDATA.ISCATE], al |
mov [esi + TREKDATA.IENTESC], al |
mov [esi + TREKDATA.ISATB], al |
fld [esi + TREKDATA.DATE] |
fld [glb_dbl_0dot2777] |
faddp |
fstp [esi + TREKDATA.FUTURE6] |
fld [glb_dbl_1E38] |
fstp [esi + TREKDATA.FUTURE7] |
mcLoadLocal al, loc52.nIQX |
mcLoadLocal dl, loc52.nIQY |
mov [esi + TREKDATA.ISX], al |
mov [esi + TREKDATA.ISY], dl |
jmp .L500 |
.L87: |
mcLoadLocal ebx, loc52.pTrekData |
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
movzx ecx, [ebx + TREKDATA.REMCOM] |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
.find_commander: |
cmp [esi], al |
jne .get_next_commander |
cmp [edi], dl |
je .L100 |
.get_next_commander: |
inc esi |
inc edi |
loop .find_commander |
;int 3 |
jmp .L500 |
.L100: |
mcLoadLocal al, loc52.nIQX |
mcLoadLocal dl, loc52.nIQY |
mov [esi], al |
mov [edi], dl |
mcLoadLocal edi, loc52.pTrekData |
mov [edi + TREKDATA.COMHERE], 0 |
.L500: |
mcLoadLocal esi, loc52.pTrekData |
movzx ecx, [esi + TREKDATA.NENHERE] |
inc [esp + loc52.nI] |
cmp [esp + loc52.nI], ecx |
jbe .L1 |
call TCommon_SortKlingons |
.done: |
mcEndLocals loc52.size |
ret |
; -------------------------------------------------------------------------- |
; ATTACK |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc36: |
.pTrekData PVOID ? |
.bIHURT BOOL ? |
.bATTACKED BOOL ? |
.dbl_HITMAX DOUBLE ? |
.dbl_HITTOT DOUBLE ? |
.dbl_DUSTFAC DOUBLE ? |
.dbl_HIT DOUBLE ? |
.nL INDEX ? |
.nNENHERE COUNT ? |
.pKPOWER PDOUBLE ? |
.pKDIST PDOUBLE ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.chIQUAD BYTE ? |
.ch1 BYTE ? |
.ch2 BYTE ? |
.ch3 BYTE ? |
.nPERCENT INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TAttack_Main: |
mcBeginLocals loc36.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc36.pTrekData, esi |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
cmp [esi + TREKDATA.ITHERE], 0 |
je .check_neutral_zone |
push esi |
call TEvents_MoveTholian |
pop esi |
.check_neutral_zone: |
cmp [esi + TREKDATA.NEUTZ], 0 |
je .L1 |
dec [esi + TREKDATA.NEUTZ] |
jmp .done |
.L1: |
cmp [esi + TREKDATA.NENHERE], 0 |
je .done |
movzx eax, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc36.nNENHERE, eax |
lea eax, [esi + TREKDATA.KPOWER] |
lea edx, [esi + TREKDATA.KDIST] |
lea edi, [esi + TREKDATA.KX] |
lea ecx, [esi + TREKDATA.KY] |
mcStoreLocal loc36.pKPOWER, eax |
mcStoreLocal loc36.pKDIST, edx |
mcStoreLocal loc36.pKX, edi |
mcStoreLocal loc36.pKY, ecx |
mov al, [esi + TREKDATA.ISHERE] |
add al, [esi + TREKDATA.COMHERE] |
mcOnRegZero al, .check_skill |
cmp [esi + TREKDATA.JUSTIN], 0 |
jne .check_skill |
.move_enemies: |
call TAttack_MoveCommanders |
invoke Sleep, 200 |
mcLoadLocal esi, loc36.pTrekData |
movzx eax, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc36.nNENHERE, eax |
jmp .hit_the_ship |
.check_skill: |
cmp [esi + TREKDATA.KSTUF5], 2 |
je .move_enemies |
.hit_the_ship: |
mcZeroBits eax |
mcStoreLocal loc36.bIHURT, eax |
mcStoreLocal loc36.bATTACKED, eax |
mcStoreLocal loc36.nL, eax |
call TConsole_ScrollUp |
fldz |
fldz |
fstp [esp + loc36.dbl_HITMAX] |
fstp [esp + loc36.dbl_HITTOT] |
jmp .L5 |
.next_evil_doer: |
inc [esp + loc36.pKX] |
inc [esp + loc36.pKY] |
add [esp + loc36.pKPOWER], 10 |
add [esp + loc36.pKDIST], 10 |
.L5: |
inc [esp + loc36.nL] |
mcLoadLocal ecx, loc36.nL |
cmp ecx, [esp + loc36.nNENHERE] |
ja .L80 |
; |
; If ship is docked - no hits! |
; |
mcLoadLocal esi, loc36.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L6 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 241 |
call TConsole_Cram |
call TConsole_CramShip |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
jmp .done |
.L6: |
; |
; If enemy's power is negative - they can't attack |
; |
mcLoadLocal esi, loc36.pKPOWER |
fldz |
fld tbyte [esi] |
mc_CMP_ST0_ST1 |
jc .next_evil_doer |
jz .next_evil_doer |
inc [esp + loc36.bATTACKED] |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_0dot8] |
faddp |
fstp [esp + loc36.dbl_DUSTFAC] |
mcLoadLocalRef esi, loc36.dbl_DUSTFAC |
mcLoadLocal edi, loc36.pKDIST |
call TCommon_X_exp_Y |
mcLoadLocal ebx, loc36.pKPOWER |
fld tbyte [ebx] |
fmulp |
fstp [esp + loc36.dbl_HIT] |
mcLoadLocal esi, loc36.pKX |
mcLoadLocal edi, loc36.pKY |
mov al, [esi] |
mov dl, [edi] |
call TArray_QuadPtr |
mov al, [ebx] |
mcStoreLocal loc36.chIQUAD, al |
; |
; Decide if enemy will fire a torpedo. |
; |
fld [esp + loc36.dbl_HIT] |
fld [glb_dbl_400] |
mc_CMP_ST0_ST1 |
jc .L10 |
mcLoadLocal esi, loc36.pTrekData |
cmp [esi + TREKDATA.JUSTIN], 1 |
je .L10 |
fld [glb_dbl_300] |
fld [esp + loc36.dbl_HIT] |
mc_CMP_ST0_ST1 |
jc .check_enemy_type |
mcLoadLocal edi, loc36.pKDIST |
fld tbyte [edi] |
fld [glb_dbl_5] |
mc_CMP_ST0_ST1 |
jc .L10 |
.check_enemy_type: |
cmp [esp + loc36.chIQUAD], CHAR_KLINGON |
jne .torpedo_fired |
call TRandom_Ranf |
fld [glb_dbl_0dot1] |
mc_CMP_ST0_ST1 |
jc .L10 |
.torpedo_fired: |
mcLoadLocal edi, loc36.pTrekData |
mov [edi + TREKDATA.IPHWHO], 1 |
mcLoadLocal eax, loc36.nL |
mov [edi + TREKDATA.KSHOT], al |
push edi |
call KPHOTON |
pop edi |
mov [edi + TREKDATA.IPHWHO], 127 |
mov [edi + TREKDATA.KDIDIT], 1 |
cmp [edi + TREKDATA.ALLDONE], 0 |
jne .done |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
je .done |
jmp .next_evil_doer |
.L10: |
; |
; Enemy fires a disruptor weapon |
; |
mcLoadLocal ecx, loc36.nL |
mcLoadLocalRef esi, loc36.dbl_HIT |
mcLoadLocalRef edi, loc36.bIHURT |
call TAttack_Zap |
fld [esp + loc36.dbl_HIT] |
fld [esp + loc36.dbl_HITTOT] |
faddp |
fstp [esp + loc36.dbl_HITTOT] |
fld [esp + loc36.dbl_HITTOT] |
fld [esp + loc36.dbl_HITMAX] |
call TCommon_FPU_Max |
fstp [esp + loc36.dbl_HITMAX] |
; |
; Loop for enemy attacks ends here |
; |
jmp .next_evil_doer |
.L80: |
cmp [esp + loc36.bATTACKED], 0 |
je .done |
fld [esp + loc36.dbl_HITTOT] |
fldz |
mc_CMP_ST0_ST1 |
jz .done |
mcLoadLocal esi, loc36.pTrekData |
fldz |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L100 |
jz .L100 |
fld [esi + TREKDATA.SHLD] |
fld [esi + TREKDATA.INSHLD] |
fdivp |
fld [glb_dbl_100] |
fmulp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc36.nPERCENT, eax |
cmp [esp + loc36.bIHURT], 0 |
jne .L85 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 247 |
call TConsole_Cram |
jmp .L90 |
.L85: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 248 |
call TConsole_Cram |
mcLoadLocal esi, loc36.pTrekData |
mov cl, 2 |
fld [esi + TREKDATA.ENERGY] |
call TConsole_CramFloat |
mcLoad8bitsToReg32 ecx, 249 |
call TConsole_Cram |
mcLoadLocal esi, loc36.pTrekData |
movzx eax, [esi + TREKDATA.TORPS] |
call TConsole_CramInt |
mcLoad8bitsToReg32 ecx, 250 |
call TConsole_Cram |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jc .shields_damaged |
mcLoadLocal esi, loc36.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .shields_down |
push 251 |
jmp .cram_shield_state |
.shields_down: |
push 252 |
jmp .cram_shield_state |
.shields_damaged: |
push 253 |
.cram_shield_state: |
pop ecx |
call TConsole_Cram |
.L90: |
mcLoadLocal eax, loc36.nPERCENT |
call TConsole_CramInt |
mov al, '%' |
call TConsole_PutChar |
call TConsole_ScrollUp |
; |
; Check for casualties. |
; |
fld [glb_dbl_200] |
fld [esp + loc36.dbl_HITMAX] |
mc_CMP_ST0_ST1 |
jc .check_total_hit |
.get_casualties: |
fld [esp + loc36.dbl_HITTOT] |
call TAttack_Casualties |
call TConsole_SetGameMsgAttr |
.L120: |
call TCommon_SortKlingons |
jmp .done |
.check_total_hit: |
fld [glb_dbl_500] |
fld [esp + loc36.dbl_HITTOT] |
mc_CMP_ST0_ST1 |
jc .L120 |
jmp .get_casualties |
.L100: |
mov al, 5 |
call TFinish_Main |
.done: |
mcEndLocals loc36.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TChart.Asm |
---|
0,0 → 1,317 |
; -------------------------------------------------------------------------- |
; FILE: TChart.Asm |
; DATE: October 12, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = X quadrant coordinate |
; EDX = Y quadrant coordinate |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TChart_SetQuadAttr: |
push ebx ecx |
mcLoadGameDataPtr ebx |
cmp al, [ebx + TREKDATA.QUADX] |
jne .no_ship_here |
cmp dl, [ebx + TREKDATA.QUADY] |
je .ship_here |
.no_ship_here: |
call TArray_IsScanned |
jc .set_scanned_color |
mov cl, ATTR_REPORT_VALUE |
jmp .apply |
.set_scanned_color: |
mov cl, ATTR_PLANET |
jmp .apply |
.ship_here: |
mov cl, ATTR_SHIP_QUAD |
.apply: |
call TConsole_SetAttr |
pop ecx ebx |
ret |
; -------------------------------------------------------------------------- |
; CHART |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc25: |
.nI INDEX ? |
.nJ INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TChart_Main: |
mcBeginLocals loc25.size |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 136 |
call TConsole_Prout |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 137 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 138 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 139 |
call TConsole_Prout |
mcLoad1 eax |
mcStoreLocal loc25.nI, eax |
.row_begins: |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
mcLoadLocal eax, loc25.nI |
call TConsole_CramInt |
mcLoad8bitsToReg32 ecx, 140 |
call TConsole_Cram |
mcLoad1 ecx |
mcStoreLocal loc25.nJ, ecx |
.load_chart_value: |
mcLoadLocal eax, loc25.nI |
mcLoadLocal edx, loc25.nJ |
call TChart_SetQuadAttr |
call TArray_GetStarChartValue |
add ecx, 0 |
js .L10 |
jz .L20 |
cmp ecx, 999 |
ja .L35 |
call TArray_GetGalaxyValue |
mov eax, ecx |
.put_value: |
mov cl, 5 |
call TConsole_CramIntWidth |
jmp .L40 |
.L35: |
lea eax, [ecx - 1000] |
jmp .put_value |
.L40: |
inc [esp + loc25.nJ] |
cmp [esp + loc25.nJ], 8 |
jbe .load_chart_value |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 139 |
call TConsole_Prout |
inc [esp + loc25.nI] |
cmp [esp + loc25.nI], 8 |
jbe .row_begins |
call TConsole_ScrollUp |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
mov cl, 2 |
call TConsole_RepeatBlank |
call TConsole_CramShip |
mcLoad8bitsToReg32 ecx, 143 |
call TConsole_Cram |
mov cl, 1 |
mcLoadGameDataPtr esi |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TConsole_CramLoc |
jmp .done |
.L10: |
mcLoad8bitsToReg32 ecx, 141 |
.L101: |
call TConsole_Cram |
jmp .L40 |
.L20: |
mcLoad8bitsToReg32 ecx, 142 |
jmp .L101 |
.done: |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
mcEndLocals loc25.size |
ret |
; -------------------------------------------------------------------------- |
; SETWARP |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc51: |
.pTrekData PVOID ? |
.dbl_OLDFAC DOUBLE ? |
.dbl_FNUM DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TChart_SetWarp: |
mcBeginLocals loc51.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc51.pTrekData, esi |
.L10: |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L20 |
mov ecx, 585 |
call TGame_Prompt |
jmp .L10 |
.L20: |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L40 |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc51.dbl_FNUM] |
mov cl, DEV_WARP_ENGINES |
call TArray_GetDblDamage |
fld [glb_dbl_Ten] |
mc_CMP_ST0_ST1 |
jc .L70 |
mov cl, DEV_WARP_ENGINES |
call TArray_IsDamaged |
jnc .validate_warp |
fld [esp + loc51.dbl_FNUM] |
fld [glb_dbl_4] |
mc_CMP_ST0_ST1 |
jc .L80 |
.validate_warp: |
fld1 |
fld [esp + loc51.dbl_FNUM] |
mc_CMP_ST0_ST1 |
jc .L50 |
fld [esp + loc51.dbl_FNUM] |
fld [glb_dbl_Ten] |
mc_CMP_ST0_ST1 |
jc .L60 |
mcLoadLocal esi, loc51.pTrekData |
fld [esi + TREKDATA.WARPFAC] |
fstp [esp + loc51.dbl_OLDFAC] |
fld [esp + loc51.dbl_FNUM] |
fstp [esi + TREKDATA.WARPFAC] |
fld [esp + loc51.dbl_FNUM] |
fld st |
fmulp |
fstp [esi + TREKDATA.WFACSQ] |
fld [esp + loc51.dbl_OLDFAC] |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L31 |
jz .L31 |
fld [glb_dbl_6] |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L31 |
jz .L31 |
fld [glb_dbl_8] |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L32 |
jmp .L33 |
.L31: |
call TConsole_SetCrewMsgAttr |
mov ecx, 586 |
call TConsole_Cram |
mcLoadLocal esi, loc51.pTrekData |
fld [esi + TREKDATA.WARPFAC] |
mov cl, 1 |
call TConsole_CramFloat |
mov ecx, 587 |
call TConsole_Prout |
jmp .done |
.L32: |
call TConsole_SetCrewMsgAttr |
mov ecx, 588 |
call TConsole_Prout |
jmp .done |
.L33: |
mcLoadLocal esi, loc51.pTrekData |
fld [esi + TREKDATA.WARPFAC] |
fld [glb_dbl_Ten] |
mc_CMP_ST0_ST1 |
jz .L36 |
call TConsole_SetCrewMsgAttr |
mov ecx, 589 |
call TConsole_Prout |
jmp .done |
.L36: |
call TConsole_SetCrewMsgAttr |
mov ecx, 590 |
call TConsole_Prout |
jmp .done |
.L40: |
call TMove_BegPardon |
jmp .done |
.L50: |
call TConsole_SetCrewMsgAttr |
mov ecx, 591 |
call TConsole_Prout |
jmp .done |
.L60: |
call TConsole_SetCrewMsgAttr |
mov ecx, 592 |
call TConsole_Prout |
jmp .done |
.L70: |
mov ecx, 593 |
call TConsole_ProutGameMsg |
jmp .done |
.L80: |
call TConsole_SetCrewMsgAttr |
mov ecx, 594 |
call TConsole_Prout |
mov ecx, 595 |
call TConsole_Prout |
.done: |
mcEndLocals loc51.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TCmdBuf.Asm |
---|
0,0 → 1,529 |
; -------------------------------------------------------------------------- |
; FILE: TCmdBuf.Asm |
; DATE: September 27, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI token scanned |
; CL = ANSI text to match (1-based index into message table) |
; Output: |
; CF=TRUE if first token exactly matches text at index in CL |
; CF=FALSE if no match (message given to the user) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_VerifyToken: |
movzx ecx, cl |
TCmdBuf_VerifyToken_ECX: |
push esi |
call TMsgTable_GetItem |
pop edi |
call TString_AnsiEqual |
jnc .ret_false |
ret |
.ret_false: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 93 |
call TConsole_Prout |
call TConsole_ScrollUp |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI token scanned |
; ECX = ANSI text to match (1-based index into message table) |
; Output: |
; CF=TRUE if text at EDI has a prefix like ESI |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_Crop: |
push esi esi |
call TMsgTable_GetItem |
mov edi, esi |
pop esi |
mcZeroBits edx |
mcZeroBits eax |
.load_chars: |
lodsb |
mov dl, [edi] |
inc edi |
cmp dl, al |
je .check_zero |
mcOnRegZero eax, .match |
pop esi |
clc |
ret |
.check_zero: |
mcOnRegNotZero eax, .load_chars |
.match: |
pop esi |
stc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AX = WCHAR to append |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_PutChar: |
mov ebx, [glb_pCmdBuf] |
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], CMDBUF_MAX_CHARS |
je .done |
mcLoadMember ecx, TCmdBuf.cmdbuf_CmdColumn |
mov [ebx + ecx*2], ax |
inc [ebx + TCmdBuf.cmdbuf_CmdColumn] |
.done: |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_Parse: |
mcZeroBits eax |
call TCmdBuf_PutChar |
mov ebx, [glb_pCmdBuf] |
mcStoreMember TCmdBuf.cmdbuf_NumTokens, eax |
mcStoreMember TCmdBuf.cmdbuf_CmdColumn, eax |
dec eax |
mcStoreMember TCmdBuf.cmdbuf_TokenIterator, eax |
inc eax |
mov esi, ebx |
mov edx, eax |
mcLoadMemberRef edi, TCmdBuf.cmdbuf_CmdTokens |
.load_char: |
lodsw |
mcOnRegZero eax, .done |
cmp al, CHAR_BLANK |
je .separator |
mcOnRegNotZero edx, .load_char |
lea edx, [esi - 2] |
mov [edi], edx |
add edi, 4 |
inc [ebx + TCmdBuf.cmdbuf_NumTokens] |
cmp [ebx + TCmdBuf.cmdbuf_NumTokens], CMDBUF_MAX_TOKENS |
je .done |
jmp .load_char |
.separator: |
mcZeroBits edx |
mov [esi - 2], dx |
jmp .load_char |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = character |
; Output: |
; CF = TRUE if AL is a digit |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_IsDigit: |
cmp al, '0' |
jb .false |
cmp al, '9' |
ja .false |
stc |
ret |
.false: |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = token address |
; Output: |
; CF = TRUE if token is a real value: "-100" or "5.6" |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_IsRealToken: |
mcZeroBits ecx |
mcZeroBits eax |
mcZeroBits edi |
.load_char: |
mov ax, [esi + ecx*2] |
inc ecx |
mcOnRegZero eax, .true |
mcOnRegEqu al, '-', .minus |
mcOnRegEqu al, '.', .period |
; |
; Check if digit |
; |
call TCmdBuf_IsDigit |
jc .load_char |
.false: |
clc |
ret |
.minus: |
mcOnRegEqu ecx, 1, .load_char |
jmp .false |
.period: |
mcOnRegNotZero edi, .false |
mov edi, esi |
jmp .load_char |
.true: |
stc |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; ESI = token address or NULL |
; EAX = token type (CMD_TOKEN_ALPHA, CMD_TOKEN_REAL, CMD_TOKEN_EOL) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_GetNextToken: |
mov ebx, [glb_pCmdBuf] |
inc [ebx + TCmdBuf.cmdbuf_TokenIterator] |
mcLoadMember ecx, TCmdBuf.cmdbuf_TokenIterator |
cmp ecx, [ebx + TCmdBuf.cmdbuf_NumTokens] |
jae .end_of_line |
mov esi, [ebx + ecx*4 + TCmdBuf.cmdbuf_CmdTokens] |
call TCmdBuf_IsRealToken |
jc .real_value |
mcLoad8bitsToReg32 eax, CMD_TOKEN_ALPHA |
ret |
.real_value: |
mcLoad8bitsToReg32 eax, CMD_TOKEN_REAL |
ret |
.end_of_line: |
mcZeroBits eax |
mcZeroBits esi |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI text |
; AL = character to find |
; Output: |
; ECX = character offset (CF=TRUE) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_AnsiFindChar: |
mcZeroBits ecx |
.test_char: |
cmp byte [esi + ecx], 0 |
je .not_found |
cmp [esi + ecx], al |
je .found |
inc ecx |
jmp .test_char |
.found: |
stc |
ret |
.not_found: |
clc |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EBX = TCmdBuf instance |
; ESI = ANSI token scanned |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_Scan: |
call TCmdBuf_GetNextToken |
mcStoreMember TCmdBuf.cmdbuf_KEY, al |
mcZeroBits edx |
mcStoreMember TCmdBuf.cmdbuf_INUM, edx |
mcStoreMember TCmdBuf.cmdbuf_AnsiTokenBuf, dl |
fldz |
fstp [ebx + TCmdBuf.cmdbuf_FNUM] |
mcOnRegZero esi, .done |
; |
; Convert the token into ANSI |
; |
mcLoadMemberRef edi, TCmdBuf.cmdbuf_AnsiTokenBuf |
mov eax, edx |
.convert_char: |
lodsw |
stosb |
mcOnRegNotZero eax, .convert_char |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
je .done |
mcLoadMemberRef esi, TCmdBuf.cmdbuf_AnsiTokenBuf |
mov al, '.' |
call TCmdBuf_AnsiFindChar |
jc .set_fp_num |
; |
; Integer value scanned |
; |
call TCmdBuf_AnsiStr2Int32 |
mcStoreMember TCmdBuf.cmdbuf_INUM, eax |
fild [ebx + TCmdBuf.cmdbuf_INUM] |
fstp [ebx + TCmdBuf.cmdbuf_FNUM] |
jmp .done |
.set_fp_num: |
; |
; FP value scanned |
; |
mcLoadMemberRef edi, TCmdBuf.cmdbuf_FNUM |
call TCmdBuf_AnsiStr2Double |
.done: |
mcLoadMemberRef esi, TCmdBuf.cmdbuf_AnsiTokenBuf |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI text |
; Output: |
; ECX = number of characters in the string |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_AnsiStrLen: |
push edx |
mcZeroBits ecx |
mcZeroBits edx |
.check_char: |
cmp [esi + ecx], dl |
je .done |
inc ecx |
jmp .check_char |
.done: |
pop edx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI text |
; Output: |
; EAX = converted value |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc5: |
.bNegative BOOL ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_AnsiStr2Int32: |
mcBeginLocals loc5.size |
mcZeroBits eax |
mcZeroBits edx |
mcStoreLocal loc5.bNegative, eax |
cmp byte [esi], '-' |
jne .convert |
inc [esp + loc5.bNegative] |
inc esi |
.convert: |
mov dl, [esi] |
mcOnRegZero edx, .apply_sign |
sub dl, '0' |
inc esi |
imul eax, 10 |
add eax, edx |
jmp .convert |
.apply_sign: |
cmp byte [esp + loc5.bNegative], 0 |
je .done |
neg eax |
.done: |
mcEndLocals loc5.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = text |
; EDI = pointer to DOUBLE value |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc6: |
.pszDot PCHAR ? |
.pszValue PCHAR ? |
.bNegative BOOL ? |
.iPart1 INT32 ? |
.iPart2 INT32 ? |
.pDblResult PDOUBLE ? |
.dblPart1 DOUBLE ? |
.dblPart2 DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_AnsiStr2Double: |
mcBeginLocals loc6.size |
mcStoreLocal loc6.pszValue, esi |
mcStoreLocal loc6.pDblResult, edi |
mcZeroBits eax |
mcStoreLocal loc6.bNegative, eax |
mcStoreLocal loc6.pszDot, eax |
cmp byte [esi], '-' |
jne .parse |
inc [esp + loc6.bNegative] |
inc [esp + loc6.pszValue] |
inc esi |
.parse: |
lodsb |
mcOnRegZero eax, .analysis |
mcOnRegEqu al, '.', .dot |
jmp .parse |
.dot: |
lea edx, [esi - 1] |
mcStoreLocal loc6.pszDot, edx |
jmp .parse |
.analysis: |
cmp byte [esp + loc6.pszDot], 0 |
jne .combine_parts |
; |
; No decimal point |
; |
mcLoadLocal esi, loc6.pszValue |
call TCmdBuf_AnsiStr2Int32 |
mcStoreLocal loc6.iPart1, eax |
fild [esp + loc6.iPart1] |
jmp .apply_sign |
.combine_parts: |
mcLoadLocal edi, loc6.pszDot |
mcZeroBits al |
stosb |
fldz |
fldz |
fstp [esp + loc6.dblPart1] |
fstp [esp + loc6.dblPart2] |
mov esi, edi |
call TCmdBuf_AnsiStr2Int32 |
mcStoreLocal loc6.iPart2, eax |
mcLoadLocal esi, loc6.pszValue |
call TCmdBuf_AnsiStr2Int32 |
mcStoreLocal loc6.iPart1, eax |
mcLoadLocal esi, loc6.pszDot |
inc esi |
call TCmdBuf_AnsiStrLen |
jecxz .combine |
fild [esp + loc6.iPart2] |
@@: |
fld [glb_dbl_Ten] |
fdivp |
loop @r |
fstp [esp + loc6.dblPart2] |
.combine: |
fild [esp + loc6.iPart1] |
fld [esp + loc6.dblPart2] |
faddp |
.apply_sign: |
cmp byte [esp + loc6.bNegative], 0 |
je .done |
fchs |
.done: |
mcLoadLocal edi, loc6.pDblResult |
fstp tbyte [edi] |
mcEndLocals loc6.size |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; CF = TRUE if buffer has no characters |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_IsEmpty: |
mov ebx, [glb_pCmdBuf] |
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], 0 |
sete cl |
shr cl, 1 |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_Backspace: |
mov ebx, [glb_pCmdBuf] |
cmp [ebx + TCmdBuf.cmdbuf_CmdColumn], 0 |
je .done |
dec [ebx + TCmdBuf.cmdbuf_CmdColumn] |
.done: |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCmdBuf_Create: |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TCmdBuf.size |
mov [glb_pCmdBuf], eax |
mov edi, eax |
mcZeroBits eax |
mov ecx, TCmdBuf.size |
rep stosb |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TCmdBuf.Inc |
---|
0,0 → 1,37 |
; -------------------------------------------------------------------------- |
; FILE: TCmdBuf.Inc |
; DATE: September 27, 2008 |
; -------------------------------------------------------------------------- |
CMDBUF_ROOM_CHARS = 64 |
CMDBUF_MAX_CHARS = (CMDBUF_ROOM_CHARS - 1) |
CMDBUF_MAX_TOKENS = 16 |
; -------------------------------------------------------------------------- |
CMD_TOKEN_EOL = 0 |
CMD_TOKEN_REAL = 1 |
CMD_TOKEN_ALPHA = 2 |
CMD_TOKEN_ERROR = 3 |
; -------------------------------------------------------------------------- |
virtual at 0 |
TCmdBuf: |
.cmdbuf_FullBuffer WCHARS CMDBUF_ROOM_CHARS |
.cmdbuf_CmdColumn INDEX ? |
.cmdbuf_CmdTokens STRINGS CMDBUF_MAX_TOKENS |
.cmdbuf_NumTokens COUNT ? |
.cmdbuf_TokenIterator INDEX ? |
.cmdbuf_AnsiTokenBuf CHARS CMDBUF_ROOM_CHARS |
; |
; If scanned token is of type CMD_TOKEN_REAL |
; then following section is filled, otherwise |
; all following members are set to zero |
; |
.cmdbuf_INUM INT32 ? |
.cmdbuf_FNUM DOUBLE ? |
.cmdbuf_KEY BYTE ? |
.cmdbuf_Reserved BYTE ? |
.size = $ |
end virtual |
; --- EOF --- |
/programs/games/StarTrek/trunk/TCommon.Asm |
---|
0,0 → 1,1644 |
; -------------------------------------------------------------------------- |
; FILE: TCommon.Asm |
; DATE: October 4, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AbsEAX: |
add eax, 0 |
js .flip_negative |
ret |
.flip_negative: |
neg eax |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = DOUBLE value B |
; ST(1) = DOUBLE value A |
; Output: |
; ST(0) = A with a sign of B |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_FPU_SignAB: |
mcZeroBits eax |
fldz |
mc_CMP_ST0_ST1 |
adc eax, eax ; EAX=1 if B is positive |
fabs |
mcOnRegZero eax, .negative |
ret |
.negative: |
fchs |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = DOUBLE value #1 |
; ST(1) = DOUBLE value #2 |
; Output: |
; ST(0) = maximum of two values |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_FPU_Max: |
mcBeginLocals 16 |
fld st |
fstp tbyte [esp] |
fcomip st, st1 |
jc .done |
fstp [glb_dbl_FpuPopper] |
fld tbyte [esp] |
.done: |
mcEndLocals 16 |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = DOUBLE value #1 |
; ST(1) = DOUBLE value #2 |
; Output: |
; ST(0) = minimum of two values |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_FPU_Min: |
mcBeginLocals 16 |
fld st |
fstp tbyte [esp] |
fcomip st, st1 |
jnc .done |
fstp [glb_dbl_FpuPopper] |
fld tbyte [esp] |
.done: |
mcEndLocals 16 |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_Allocate: |
mcAllocatePages TCommon.size |
mov [glb_pCommon], eax |
add eax, TCommon.GAMEDB |
mov [glb_pGameData], eax |
ret |
; -------------------------------------------------------------------------- |
; EXPRAN |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = AVERAGE |
; Output: |
; ST(0) = -AVERAGE * LOG (RANF(0)) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_ExpRan: |
fchs |
fld1 |
call TRandom_Ranf |
fyl2x |
fldln2 |
fmulp |
fmulp |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = byte lo load |
; Output: |
; ST(0) = DOUBLE loaded for processing |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_LoadByteIntoFPU: |
movzx eax, al |
mov [glb_FPU_Int32], eax |
fild [glb_FPU_Int32] |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = value lo load |
; Output: |
; ST(0) = DOUBLE loaded for processing |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_FPU_Load_EAX: |
mov [glb_FPU_Int32], eax |
fild [glb_FPU_Int32] |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = DOUBLE value |
; Output: |
; EAX = truncated Int32 value |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_FP_Truncate: |
fisttp [glb_FPU_Int32] |
mov eax, [glb_FPU_Int32] |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = points to DOUBLE X value |
; EDI = points to DOUBLE Y value |
; Output: |
; ST(0) = result X**Y |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_X_exp_Y: |
fld tbyte [edi] |
fld tbyte [esi] |
fyl2x |
fld st |
frndint |
fsub st1, st |
fxch |
f2xm1 |
fld1 |
faddp |
fscale |
fxch |
mcFpuPop |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc12: |
.nQuadrants COUNT ? |
.nStars COUNT ? |
.pQuadrant PINT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateStars: |
mcBeginLocals loc12.size |
mcLoad8bitsToReg32 eax, 64 |
mcStoreLocal loc12.nQuadrants, eax |
mcLoadGameDataPtr edx |
lea edi, [edx + TREKDATA.GALAXY] |
mcStoreLocal loc12.pQuadrant, edi |
mcZeroBits ecx |
mcStoreLocal loc12.nStars, ecx |
.stars_for_quadrant: |
mcLoad8bitsToReg32 edx, 9 |
call TRandom_IRan |
inc eax |
add [esp + loc12.nStars], eax |
mcLoadLocal edi, loc12.pQuadrant |
mov [edi], eax |
add [esp + loc12.pQuadrant], 4 |
dec [esp + loc12.nQuadrants] |
jnz .stars_for_quadrant |
mcLoadLocal eax, loc12.nStars |
mcLoadGameDataPtr ebx |
mcStoreMember TREKDATA.INSTAR, eax |
mcEndLocals loc12.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc13: |
.base_IX INT32 ? |
.base_IY INT32 ? |
.base_DISTQ_max INT32 ? |
.loop_I INT32 ? |
.loop_J INT32 ? |
.loop_LIM INT32 ? |
.loop_INBASE INT32 ? |
.pBaseQX PINT32 ? |
.pBaseQY PINT32 ? |
.pGalaxyCell PINT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateBases: |
mcBeginLocals loc13.size |
mcLoadGameDataPtr esi |
movzx eax, [esi + TREKDATA.INBASE] |
mcStoreLocal loc13.loop_INBASE, eax |
sub eax, 6 |
neg eax |
imul eax, 6 |
mcStoreLocal loc13.base_DISTQ_max, eax |
lea edx, [esi + TREKDATA.BASEQX] |
lea ecx, [esi + TREKDATA.BASEQY] |
mcStoreLocal loc13.pBaseQX, edx |
mcStoreLocal loc13.pBaseQY, ecx |
mcLoad1 eax |
mcStoreLocal loc13.loop_I, eax |
.L6: |
call TRandom_IRan8 |
mcStoreLocal loc13.base_IX, eax |
mcStoreLocal loc13.base_IY, edx |
call TArray_GalaxyPtr |
mcStoreLocal loc13.pGalaxyCell, ebx |
cmp dword [ebx], 10 |
jae .L6 |
cmp [esp + loc13.loop_I], 1 |
je .L8 |
mcLoadLocal ecx, loc13.loop_I |
dec ecx |
mcStoreLocal loc13.loop_LIM, ecx |
; |
; Check distances to already set up bases |
; |
mcLoad1 eax |
mcStoreLocal loc13.loop_J, eax |
.calculate_distance: |
mcLoadLocal ecx, loc13.loop_J |
dec ecx |
mcLoadLocal esi, loc13.pBaseQX |
mcLoadLocal edi, loc13.pBaseQY |
mcLoadLocal edx, loc13.base_IX |
mcLoadLocal eax, loc13.base_IY |
sub dl, [esi + ecx] |
sub al, [edi + ecx] |
movsx ecx, dl |
imul ecx, ecx |
movsx edx, al |
imul edx, edx |
add edx, ecx |
cmp edx, [esp + loc13.base_DISTQ_max] |
jae .L8 |
fld [glb_dbl_0dot75] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L6 |
inc [esp + loc13.loop_J] |
mcLoadLocal ecx, loc13.loop_J |
cmp ecx, [esp + loc13.loop_LIM] |
jbe .calculate_distance |
.L8: |
mcLoadLocal esi, loc13.pBaseQX |
mcLoadLocal edi, loc13.pBaseQY |
mcLoadLocal eax, loc13.base_IX |
mcLoadLocal edx, loc13.base_IY |
mcLoadLocal ecx, loc13.loop_I |
dec ecx |
mov [esi + ecx], al |
mov [edi + ecx], dl |
mcLoad8bitsToReg32 ecx, -1 |
call TArray_SetStarChartValue |
mcLoadLocal edi, loc13.pGalaxyCell |
add dword [edi], 10 |
; |
; Next base... |
; |
inc [esp + loc13.loop_I] |
mcLoadLocal ecx, loc13.loop_I |
cmp ecx, [esp + loc13.loop_INBASE] |
jbe .L6 |
mcEndLocals loc13.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc14: |
.nKREM COUNT ? |
.nKLUMP COUNT ? |
.nKLUMPER COUNT ? |
.nNUM COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateKlingons: |
mcBeginLocals loc14.size |
mcLoadGameDataPtr esi |
mcZeroBits eax |
mov al, [esi + TREKDATA.INKLING] |
sub al, [esi + TREKDATA.INCOM] |
sub al, [esi + TREKDATA.NSCREM] |
mcStoreLocal loc14.nKREM, eax |
movzx edx, [esi + TREKDATA.SKILL] |
movzx ecx, [esi + TREKDATA.LENGTH] |
sub ecx, 9 |
neg ecx |
imul ecx, edx |
mov [glb_FPU_Int32], ecx |
fild [glb_FPU_Int32] |
fld [glb_dbl_DOCKFAC] |
fmulp |
fld1 |
faddp |
call TCommon_FP_Truncate |
cmp eax, 9 |
jbe .store_KLUMPER |
mcLoad8bitsToReg32 eax, 9 |
.store_KLUMPER: |
mcStoreLocal loc14.nKLUMPER, eax |
.L10: |
call TRandom_Ranf |
fld st |
fmulp |
fld1 |
fsubrp |
fild [esp + loc14.nKLUMPER] |
fmulp |
call TCommon_FP_Truncate |
cmp eax, [esp + loc14.nKREM] |
jbe .store_KLUMP |
mcLoadLocal eax, loc14.nKREM |
.store_KLUMP: |
mcStoreLocal loc14.nKLUMP, eax |
imul eax, 100 |
mcStoreLocal loc14.nNUM, eax |
.L15: |
call TRandom_IRan8 |
call TArray_GalaxyPtr |
mov eax, [ebx] |
add eax, [esp + loc14.nNUM] |
cmp eax, 999 |
ja .L15 |
mcLoadLocal ecx, loc14.nNUM |
add [ebx], ecx |
mcLoadLocal edx, loc14.nKLUMP |
sub [esp + loc14.nKREM], edx |
cmp [esp + loc14.nKREM], 0 |
jne .L10 |
mcEndLocals loc14.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc15: |
.loop_INCOM COUNT ? |
.loop_IY INT32 ? |
.loop_IX INT32 ? |
.loop_I COUNT ? |
.loop_JJ COUNT ? |
.loop_IM1 COUNT ? |
.pCX PBYTE ? |
.pCY PBYTE ? |
.pGalaxyCell PINT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateCommanders: |
mcBeginLocals loc15.size |
mcLoadGameDataPtr ebx |
lea esi, [ebx + TREKDATA.CX] |
lea edi, [ebx + TREKDATA.CY] |
mcStoreLocal loc15.pCX, esi |
mcStoreLocal loc15.pCY, edi |
movzx ecx, [ebx + TREKDATA.INCOM] |
mcStoreLocal loc15.loop_INCOM, ecx |
mcLoad1 eax |
mcStoreLocal loc15.loop_I, eax |
.L16: |
call TRandom_IRan8 |
mcStoreLocal loc15.loop_IY, edx |
mcStoreLocal loc15.loop_IX, eax |
call TArray_GalaxyPtr |
mcStoreLocal loc15.pGalaxyCell, ebx |
cmp dword [ebx], 99 |
jae .check_if_quad_full |
fld [glb_dbl_0dot75] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L16 |
.check_if_quad_full: |
mcLoadLocal esi, loc15.pGalaxyCell |
cmp dword [esi], 899 |
ja .L16 |
cmp [esp + loc15.loop_I], 1 |
je .L17 |
; |
; Verify that quadrant IX,IY does not contain commander already |
; |
mcLoadLocal ecx, loc15.loop_I |
dec ecx |
mcLoadLocal esi, loc15.pCX |
mcLoadLocal edi, loc15.pCY |
mcZeroBits ebx |
mcZeroBits eax |
mcZeroBits edx |
.check_cx_cy: |
mov al, [esi + ebx] |
mov dl, [edi + ebx] |
cmp eax, [esp + loc15.loop_IX] |
jne .next |
cmp edx, [esp + loc15.loop_IY] |
je .L16 |
.next: |
inc ebx |
loop .check_cx_cy |
.L17: |
mcLoadLocal edi, loc15.pGalaxyCell |
add dword [edi], 100 |
mcLoadLocal ecx, loc15.loop_I |
dec ecx |
mcLoadLocal esi, loc15.pCX |
mcLoadLocal edi, loc15.pCY |
mcLoadLocal eax, loc15.loop_IX |
mcLoadLocal edx, loc15.loop_IY |
mov [esi + ecx], al |
mov [edi + ecx], dl |
inc [esp + loc15.loop_I] |
mcLoadLocal ecx, loc15.loop_I |
cmp ecx, [esp + loc15.loop_INCOM] |
jbe .L16 |
mcEndLocals loc15.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc16: |
.loop_INPLAN COUNT ? |
.pPlanet PTPlanet ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocatePlanets: |
mcBeginLocals loc16.size |
mcLoadGameDataPtr esi |
movzx ecx, [esi + TREKDATA.INPLAN] |
add esi, TREKDATA.PLNETS |
mcStoreLocal loc16.loop_INPLAN, ecx |
mcStoreLocal loc16.pPlanet, esi |
.L19: |
call TRandom_IRan8 |
call TArray_NewStufPtr |
cmp byte [ebx], 0 |
jne .L19 |
inc byte [ebx] |
mcLoadLocal ebx, loc16.pPlanet |
mov [ebx + TPlanet.planet_X], al |
mov [ebx + TPlanet.planet_Y], dl |
mcLoad8bitsToReg32 edx, 3 |
call TRandom_IRan |
inc eax |
mov [ebx + TPlanet.planet_CLASS], al |
call TRandom_Ranf |
fld [glb_dbl_1dot2] |
fmulp |
call TCommon_FP_Truncate |
mov [ebx + TPlanet.planet_DILITHIUM], al |
add [esp + loc16.pPlanet], TPlanet.size |
dec [esp + loc16.loop_INPLAN] |
jnz .L19 |
mcEndLocals loc16.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateRomulans: |
mcLoadGameDataPtr esi |
movzx ecx, [esi + TREKDATA.NROMREM] |
.L21: |
push ecx |
call TRandom_IRan8 |
call TArray_NewStufPtr |
add byte [ebx], 10 |
pop ecx |
loop .L21 |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateSuperCommander: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.NSCREM], 0 |
je .done |
.L22: |
call TRandom_IRan8 |
call TArray_GalaxyPtr |
cmp dword [ebx], 899 |
ja .L22 |
mcLoadGameDataPtr edi |
mov [edi + TREKDATA.ISX], al |
mov [edi + TREKDATA.ISY], dl |
add dword [ebx], 100 |
.done: |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_AllocateThing: |
call TRandom_Ranf |
fld [glb_dbl_0dot04] |
mc_CMP_ST0_ST1 |
jc .no_thing |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.THINGX], -1 |
je .no_thing |
call TRandom_IRan8 |
mcLoadGameDataPtr ebx |
mcStoreMember TREKDATA.THINGX, al |
mcStoreMember TREKDATA.THINGY, dl |
jmp .done |
.no_thing: |
mcZeroBits eax |
mcLoadGameDataPtr ebx |
mcStoreMember TREKDATA.THINGX, al |
mcStoreMember TREKDATA.THINGY, al |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X sector coordinate |
; DL = Y sector coordinate |
; CH = value to check |
; CL = replacement value |
; NOTE: |
; All registers are saved |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_ReserveSector: |
push ebx |
call TArray_QuadPtr |
cmp [ebx], ch |
jne .done |
mov [ebx], cl |
.done: |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = object character |
; Output: |
; AL = X sector coordinate |
; DL = Y sector coordinate |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_DropIn: |
mcBeginLocals 4 |
mov [esp], eax |
.try_sector: |
call TRandom_IRan10 |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
jne .try_sector |
mov ecx, [esp] |
mov [ebx], cl |
mcEndLocals 4 |
ret |
; -------------------------------------------------------------------------- |
; RESETD |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_ResetDist: |
call TCommon_NewCondition |
mcLoadGameDataPtr ebx |
cmp [ebx + TREKDATA.NENHERE], 0 |
je .done |
mcZeroBits ecx |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
.calc_dist: |
movzx eax, [ebx + TREKDATA.SECTX] |
movzx edx, byte [esi + ecx] |
sub eax, edx |
imul eax, eax |
push eax |
movzx eax, [ebx + TREKDATA.SECTY] |
movzx edx, byte [edi + ecx] |
sub eax, edx |
imul eax, eax |
pop edx |
add eax, edx |
call TCommon_FPU_Load_EAX |
fsqrt |
inc ecx |
call TArray_SetDblKDist |
cmp cl, [ebx + TREKDATA.NENHERE] |
jbe .calc_dist |
.done: |
ret |
; -------------------------------------------------------------------------- |
; SORTKL |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc30: |
.nEnemies COUNT ? |
.pKPower PDOUBLE ? |
.pKDist PDOUBLE ? |
.bSwitch BOOL ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_SortKlingons: |
mcBeginLocals loc30.size |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.NENHERE], 1 |
jbe .done |
lea eax, [esi + TREKDATA.KDIST] |
lea ecx, [esi + TREKDATA.KPOWER] |
lea edx, [esi + TREKDATA.KX] |
lea ebx, [esi + TREKDATA.KY] |
mcStoreLocal loc30.pKDist, eax |
mcStoreLocal loc30.pKPower, ecx |
mcStoreLocal loc30.pKX, edx |
mcStoreLocal loc30.pKY, ebx |
movzx ecx, [esi + TREKDATA.NENHERE] |
dec ecx |
mcStoreLocal loc30.nEnemies, ecx |
.L10: |
mcZeroBits eax |
mcStoreLocal loc30.bSwitch, eax |
mcZeroBits ecx |
mcZeroBits edx |
.check_distance: |
mcLoadLocal esi, loc30.pKDist |
fld tbyte [esi + edx + 10] |
fld tbyte [esi + edx] |
mc_CMP_ST0_ST1 |
jc .L20 |
jz .L20 |
; |
; Swap items from all arrays |
; |
fld tbyte [esi + edx + 10] |
fld tbyte [esi + edx] |
fstp tbyte [esi + edx + 10] |
fstp tbyte [esi + edx] |
mcLoadLocal esi, loc30.pKPower |
fld tbyte [esi + edx + 10] |
fld tbyte [esi + edx] |
fstp tbyte [esi + edx + 10] |
fstp tbyte [esi + edx] |
mcLoadLocal esi, loc30.pKX |
mov al, [esi + ecx] |
xchg al, [esi + ecx + 1] |
mov [esi + ecx], al |
mcLoadLocal esi, loc30.pKY |
mov al, [esi + ecx] |
xchg al, [esi + ecx + 1] |
mov [esi + ecx], al |
inc [esp + loc30.bSwitch] |
.L20: |
inc ecx |
add edx, 10 |
cmp ecx, [esp + loc30.nEnemies] |
jb .check_distance |
cmp [esp + loc30.bSwitch], 0 |
jne .L10 |
.done: |
mcEndLocals loc30.size |
ret |
; -------------------------------------------------------------------------- |
; NEWCOND |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_NewCondition: |
mcLoadGameDataPtr ebx |
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
je .done |
mov [ebx + TREKDATA.CONDIT], CONDITION_GREEN |
fld [glb_dbl_1000] |
fld [ebx + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jnc .check_enemies |
mov [ebx + TREKDATA.CONDIT], CONDITION_YELLOW |
.check_enemies: |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 99 |
ja .condition_red |
call TArray_MyNewStufPtr |
cmp byte [ebx], 9 |
ja .condition_red |
.done: |
ret |
.condition_red: |
mcLoadGameDataPtr ebx |
mov [ebx + TREKDATA.CONDIT], CONDITION_RED |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_DropBlackHole: |
call TRandom_Ranf |
fld [glb_dbl_0dot89] |
mc_CMP_ST0_ST1 |
jc .drop |
ret |
.drop: |
mov al, CHAR_BLACK_HOLE |
call TCommon_DropIn |
ret |
; -------------------------------------------------------------------------- |
; NEWQUAD |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc23: |
.pTrekData PVOID ? |
.nQUADNUM INT32 ? |
.nPLAN INT32 ? |
.nI INT32 ? |
.nIX INT32 ? |
.nIY INT32 ? |
.nSKILL INT32 ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.nKLHERE COUNT ? |
.nNENHERE COUNT ? |
.pKPOWER PDOUBLE ? |
.nQuadValue INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_NewQuad: |
mcBeginLocals loc23.size |
mcLoadGameDataPtr ebx |
mcStoreLocal loc23.pTrekData, ebx |
mcZeroBits eax |
dec eax |
mcStoreMember TREKDATA.LANDED, al |
inc eax |
mcStoreMember TREKDATA.BASEX, al |
mcStoreMember TREKDATA.BASEY, al |
mcStoreMember TREKDATA.KLHERE, al |
mcStoreMember TREKDATA.COMHERE, al |
mcStoreMember TREKDATA.PLNETX, al |
mcStoreMember TREKDATA.PLNETY, al |
mcStoreMember TREKDATA.ISHERE, al |
mcStoreMember TREKDATA.IRHERE, al |
mcStoreMember TREKDATA.IPLANET, al |
mcStoreMember TREKDATA.NENHERE, al |
mcStoreMember TREKDATA.NEUTZ, al |
mcStoreMember TREKDATA.INORBIT, al |
mcStoreMember TREKDATA.IENTESC, al |
mcStoreMember TREKDATA.ITHERE, al |
inc eax |
mcStoreMember TREKDATA.JUSTIN, al |
dec eax |
cmp [ebx + TREKDATA.ISCATE], al |
je .L5 |
mcStoreMember TREKDATA.ISCATE, al |
inc [ebx + TREKDATA.IENTESC] |
.L5: |
call TArray_MyGalaxyPtr |
mov eax, [ebx] |
mcStoreLocal loc23.nQUADNUM, eax |
cmp eax, 999 |
ja .L70 |
mcLoad8bitsToReg32 ecx, 100 |
mcZeroBits edx |
div ecx |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.KLHERE, al |
call TArray_MyNewStufPtr |
movzx eax, byte [ebx] |
mcLoad8bitsToReg32 ecx, 10 |
mcZeroBits edx |
div ecx |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.IRHERE, al |
mcStoreLocal loc23.nPLAN, edx |
mcLoadMember cl, TREKDATA.KLHERE |
add cl, al |
mcStoreMember TREKDATA.NENHERE, cl |
lea edi, [ebx + TREKDATA.QUAD] |
mcLoad8bitsToReg32 ecx, 100 |
mov al, CHAR_COSMOS |
rep stosb |
mcLoadMember al, TREKDATA.SECTX |
mcLoadMember dl, TREKDATA.SECTY |
mcLoadMember cl, TREKDATA.SHIP |
call TArray_QuadPtr |
mov [ebx], cl |
fld [glb_dbl_0dot08] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L17 |
mcLoadLocal ebx, loc23.pTrekData |
mcLoadMemberRef esi, TREKDATA.PASSWD |
mov edi, str_THOLIANX |
call TString_AnsiEqual |
jnc .L23 |
.L17: |
call TRandom_TholianSect |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.ITHX, al |
call TRandom_TholianSect |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.ITHY, al |
mov dl, al |
mcLoadMember al, TREKDATA.ITHX |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
jne .L17 |
mov byte [ebx], CHAR_THOLIAN |
mcLoadLocal edi, loc23.pTrekData |
inc [edi + TREKDATA.ITHERE] |
mov cl, CHAR_WEB |
mov ch, CHAR_COSMOS |
mov al, 1 |
mov dl, al |
call TCommon_ReserveSector |
mov dl, 10 |
call TCommon_ReserveSector |
mov al, 10 |
call TCommon_ReserveSector |
mov dl, 1 |
call TCommon_ReserveSector |
.L23: |
; |
; Klingons! |
; |
mcLoadLocal ebx, loc23.pTrekData |
movzx ecx, [ebx + TREKDATA.KLHERE] |
mcStoreLocal loc23.nKLHERE, ecx |
imul eax, ecx, 100 |
mcStoreLocal loc23.nQuadValue, eax |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcLoad1 eax |
mcStoreLocal loc23.pKX, esi |
mcStoreLocal loc23.pKY, edi |
mcStoreLocal loc23.nI, eax |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcStoreLocal loc23.pKPOWER, esi |
movzx eax, [ebx + TREKDATA.SKILL] |
mcStoreLocal loc23.nSKILL, eax |
cmp [esp + loc23.nQUADNUM], 100 |
jb .L34 |
mcLoadLocal eax, loc23.nQuadValue |
sub [esp + loc23.nQUADNUM], eax |
.put_klingon: |
mov al, CHAR_KLINGON |
call TCommon_DropIn |
mcLoadLocal esi, loc23.pKX |
mcLoadLocal edi, loc23.pKY |
mcLoadLocal ecx, loc23.nI |
dec ecx |
mov [esi + ecx], al |
mov [edi + ecx], dl |
mcStoreLocal loc23.nIX, eax |
mcStoreLocal loc23.nIY, edx |
call TRandom_Ranf |
fld [glb_dbl_150] |
fmulp |
mcLoadLocal eax, loc23.nSKILL |
imul eax, 25 |
add eax, 300 |
call TCommon_FPU_Load_EAX |
faddp |
mcLoadLocal edi, loc23.pKPOWER |
mcLoadLocal ecx, loc23.nI |
dec ecx |
imul ecx, 10 |
fstp tbyte [edi + ecx] |
inc [esp + loc23.nI] |
mcLoadLocal edx, loc23.nI |
cmp edx, [esp + loc23.nKLHERE] |
jbe .put_klingon |
; |
; Commander! |
; |
mcLoadLocal ebx, loc23.pTrekData |
cmp [ebx + TREKDATA.REMCOM], 0 |
je .L32 |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
call TArray_FindCommander |
jecxz .L32 |
mcLoadLocal eax, loc23.nIX |
mcLoadLocal edx, loc23.nIY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COMMANDER |
mcLoadLocal eax, loc23.nSKILL |
imul eax, 50 |
add eax, 950 |
call TCommon_FPU_Load_EAX |
call TRandom_Ranf |
fld [glb_dbl_400] |
fmulp |
faddp |
mcLoadLocal ecx, loc23.nKLHERE |
call TArray_SetDblKPower |
mcLoadLocal ebx, loc23.pTrekData |
inc [ebx + TREKDATA.COMHERE] |
.L32: |
; |
; Super-Commander!! |
; |
mcLoadLocal ebx, loc23.pTrekData |
mcLoadMember al, TREKDATA.QUADX |
cmp al, [ebx + TREKDATA.ISX] |
jne .L34 |
mcLoadMember dl, TREKDATA.QUADY |
cmp dl, [ebx + TREKDATA.ISY] |
jne .L34 |
; |
; He's here!! |
; |
mcLoadLocal eax, loc23.nKLHERE |
mcStoreLocal loc23.nI, eax |
cmp [ebx + TREKDATA.COMHERE], 0 |
je .L33 |
dec [esp + loc23.nI] |
mcLoadLocal esi, loc23.pKX |
mcLoadLocal edi, loc23.pKY |
mcLoadLocal ecx, loc23.nI |
dec ecx |
movzx eax, byte [esi + ecx] |
movzx edx, byte [edi + ecx] |
mcStoreLocal loc23.nIX, eax |
mcStoreLocal loc23.nIY, edx |
.L33: |
mcLoadLocal eax, loc23.nIX |
mcLoadLocal edx, loc23.nIY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_SCOM |
mcLoadLocal eax, loc23.nSKILL |
imul eax, 125 |
add eax, 1175 |
call TCommon_FPU_Load_EAX |
call TRandom_Ranf |
fld [glb_dbl_400] |
fmulp |
faddp |
mcLoadLocal ecx, loc23.nI |
call TArray_SetDblKPower |
mcLoadLocal ebx, loc23.pTrekData |
inc [ebx + TREKDATA.ISCATE] |
inc [ebx + TREKDATA.ISHERE] |
.L34: |
; |
; Romulans! |
; |
mcLoadLocal ebx, loc23.pTrekData |
cmp [ebx + TREKDATA.IRHERE], 0 |
je .L37 |
movzx eax, [ebx + TREKDATA.KLHERE] |
inc eax |
mcStoreLocal loc23.nI, eax |
movzx eax, [ebx + TREKDATA.NENHERE] |
mcStoreLocal loc23.nNENHERE, eax |
.drop_a_romulan: |
mov al, CHAR_ROMULAN |
call TCommon_DropIn |
mcLoadLocal ecx, loc23.nI |
dec ecx |
mcLoadLocal esi, loc23.pKX |
mcLoadLocal edi, loc23.pKY |
mov [esi + ecx], al |
mov [edi + ecx], dl |
mcLoadLocal eax, loc23.nSKILL |
imul eax, 50 |
add eax, 450 |
call TCommon_FPU_Load_EAX |
call TRandom_Ranf |
fld [glb_dbl_400] |
fmulp |
faddp |
mcLoadLocal ecx, loc23.nI |
call TArray_SetDblKPower |
inc [esp + loc23.nI] |
mcLoadLocal edx, loc23.nI |
cmp edx, [esp + loc23.nNENHERE] |
jbe .drop_a_romulan |
.L37: |
call TCommon_ResetDist |
call TCommon_SortKlingons |
; |
; Starbase |
; |
cmp [esp + loc23.nQUADNUM], 10 |
jb .L50 |
sub [esp + loc23.nQUADNUM], 10 |
mov al, CHAR_STARBASE |
call TCommon_DropIn |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.BASEX, al |
mcStoreMember TREKDATA.BASEY, dl |
.L50: |
; |
; Planet |
; |
cmp [esp + loc23.nPLAN], 0 |
je .L54 |
mcLoadLocal ebx, loc23.pTrekData |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
call TArray_FindPlanet |
mcStoreMember TREKDATA.IPLANET, cl |
jecxz .L54 |
mov al, CHAR_PLANET |
call TCommon_DropIn |
mcLoadLocal ebx, loc23.pTrekData |
mcStoreMember TREKDATA.PLNETX, al |
mcStoreMember TREKDATA.PLNETY, dl |
.L54: |
; |
; Stars like dust!.. |
; |
call TCommon_NewCondition |
cmp [esp + loc23.nQUADNUM], 0 |
je .L62 |
mcLoadLocal ecx, loc23.nQUADNUM |
.drop_star: |
push ecx |
mov al, CHAR_ASTERISK |
call TCommon_DropIn |
pop ecx |
loop .drop_star |
.L62: |
; |
; Check for Neutral Zone |
; |
mcLoadLocal ebx, loc23.pTrekData |
mcZeroBits eax |
cmp [ebx + TREKDATA.IRHERE], al |
je .L66 |
cmp [ebx + TREKDATA.KLHERE], al |
jne .L66 |
cmp [ebx + TREKDATA.BASEX], al |
jne .L66 |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jc .L64 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 85 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 86 |
call TConsole_Prout |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 87 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 88 |
call TConsole_Prout |
call TConsole_ScrollUp |
.L64: |
mcLoadLocal ebx, loc23.pTrekData |
inc [ebx + TREKDATA.NEUTZ] |
.L66: |
; |
; Check for THING!! |
; |
mcLoadLocal ebx, loc23.pTrekData |
cmp [ebx + TREKDATA.SHUTUP], 0 |
jne .L67 |
mcLoadMember al, TREKDATA.THINGX |
cmp al, [ebx + TREKDATA.QUADX] |
jne .L67 |
mcLoadMember al, TREKDATA.THINGY |
cmp al, [ebx + TREKDATA.QUADY] |
jne .L67 |
mov al, CHAR_THING |
call TCommon_DropIn |
mcLoadLocal ebx, loc23.pTrekData |
mcZeroBits eax |
mcStoreMember TREKDATA.THINGX, al |
mcStoreMember TREKDATA.THINGY, al |
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
jc .L67 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 89 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 90 |
call TConsole_Prout |
.L67: |
call TCommon_DropBlackHole |
call TCommon_DropBlackHole |
call TCommon_DropBlackHole |
mcLoadLocal ebx, loc23.pTrekData |
cmp [ebx + TREKDATA.ITHERE], 0 |
je .done |
mov ch, CHAR_WEB |
mov cl, CHAR_COSMOS |
mov al, 1 |
mov dl, al |
call TCommon_ReserveSector |
mov dl, 10 |
call TCommon_ReserveSector |
mov al, 10 |
call TCommon_ReserveSector |
mov dl, 1 |
call TCommon_ReserveSector |
jmp .done |
.L70: |
; |
; Quadrant contains supernova |
; |
mcLoadLocal edi, loc23.pTrekData |
add edi, TREKDATA.QUAD |
mcLoad8bitsToReg32 ecx, 100 |
mov al, CHAR_COSMOS |
rep stosb |
.done: |
mcEndLocals loc23.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc22: |
.pBaseX PBYTE ? |
.pBaseY PBYTE ? |
.nBases COUNT ? |
.iBase INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_PrintBaseQuads: |
mcBeginLocals loc22.size |
mcLoadGameDataPtr ebx |
mcLoadMemberRef esi, TREKDATA.BASEQX |
mcLoadMemberRef edi, TREKDATA.BASEQY |
movzx ecx, [ebx + TREKDATA.INBASE] |
mcLoad1 eax |
mcStoreLocal loc22.pBaseX, esi |
mcStoreLocal loc22.pBaseY, edi |
mcStoreLocal loc22.nBases, ecx |
mcStoreLocal loc22.iBase, eax |
.print_location: |
mcLoadLocal esi, loc22.pBaseX |
mcLoadLocal edi, loc22.pBaseY |
mcLoadLocal ecx, loc22.iBase |
dec ecx |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcZeroBits ecx |
call TConsole_CramLoc |
mcLoadLocal ecx, loc22.iBase |
cmp ecx, [esp + loc22.nBases] |
je .done |
mcLoad8bitsToReg32 ecx, 53 |
call TConsole_Cram |
inc [esp + loc22.iBase] |
jmp .print_location |
.done: |
mcEndLocals loc22.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_InitialMsg: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 47 |
call TConsole_Cram |
mov cl, 1 |
mcLoadGameDataPtr esi |
fld [esi + TREKDATA.DATE] |
push esi |
call TConsole_CramFloat |
call TConsole_ScrollUp |
pop esi |
movzx eax, [esi + TREKDATA.INKLING] |
movzx ecx, [esi + TREKDATA.NSCREM] |
sub eax, ecx |
mov cl, 5 |
push esi |
call TConsole_CramIntWidth |
mcLoad8bitsToReg32 ecx, 48 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
pop esi |
cmp [esi + TREKDATA.NSCREM], 0 |
je .L25 |
mcLoad8bitsToReg32 ecx, 50 |
push esi |
call TConsole_Prout |
pop esi |
.L25: |
fld [esi + TREKDATA.INTIME] |
call TCommon_FP_Truncate |
mov cl, 5 |
push esi |
call TConsole_CramIntWidth |
mcLoad8bitsToReg32 ecx, 51 |
call TConsole_Prout |
pop esi |
movzx eax, [esi + TREKDATA.INBASE] |
mov cl, 5 |
push esi |
call TConsole_CramIntWidth |
mcLoad8bitsToReg32 ecx, 52 |
call TConsole_Cram |
call TCommon_PrintBaseQuads |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 54 |
call TConsole_Cram |
pop esi |
mov cl, 1 |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
push esi |
call TConsole_CramLoc |
mov al, ',' |
call TConsole_PutChar |
pop esi |
mov cl, 2 |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
push esi |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 55 |
call TConsole_Cram |
pop esi |
cmp [esi + TREKDATA.NSCREM], 0 |
je .done |
mcLoad8bitsToReg32 ecx, 56 |
call TConsole_Cram |
.done: |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
ret |
; -------------------------------------------------------------------------- |
; Subroutine SETUP from original source |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc11: |
.dbl_IDATE DOUBLE ? |
.dbl_Reserved DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TCommon_Setup: |
mcBeginLocals loc11.size |
mcLoadGameDataPtr ebx |
mcStoreMember TREKDATA.SHIP, CHAR_ENTERPRISE |
fld [glb_dbl_5000] |
fld st |
fstp [ebx + TREKDATA.INENRG] |
fstp [ebx + TREKDATA.ENERGY] |
fld [glb_dbl_2500] |
fld st |
fstp [ebx + TREKDATA.INSHLD] |
fstp [ebx + TREKDATA.SHLD] |
fld [glb_dbl_4] |
fld st |
fstp [ebx + TREKDATA.INLSR] |
fstp [ebx + TREKDATA.LSUPRES] |
mcStoreMember TREKDATA.INTORPS, 10 |
mcStoreMember TREKDATA.TORPS, 10 |
mcStoreMember TREKDATA.NPTUBES, 3 |
fld [glb_dbl_5] |
fld [glb_dbl_25] |
fstp [ebx + TREKDATA.WFACSQ] |
fstp [ebx + TREKDATA.WARPFAC] |
call TRandom_Ranf |
fld [glb_dbl_31] |
fmulp |
fld [glb_dbl_20] |
faddp |
fld [glb_dbl_100] |
fmulp |
fld st |
fld st |
fstp [ebx + TREKDATA.DATE] |
fstp [ebx + TREKDATA.INDATE] |
fstp [ebx + TREKDATA.DOCKDATE] |
call TRandom_IRan8 |
mcStoreMember TREKDATA.QUADX, al |
mcStoreMember TREKDATA.QUADY, dl |
call TRandom_IRan10 |
mcStoreMember TREKDATA.SECTX, al |
mcStoreMember TREKDATA.SECTY, dl |
mcStoreMember TREKDATA.ISCRAFT, 1 |
mcStoreMember TREKDATA.ALIVE, 1 |
mcStoreMember TREKDATA.LANDED, -1 |
fld [glb_dbl_0dot05] |
fstp [ebx + TREKDATA.CRYPROB] |
; |
; Events |
; |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE1] |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_1dot5] |
fmulp |
movzx ecx, [ebx + TREKDATA.REMCOM] |
mov [glb_FPU_Int32], ecx |
fild [glb_FPU_Int32] |
fdivp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE2] |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE3] |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot3] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE4] |
fld [glb_dbl_1E38] |
fld st |
fld st |
fstp [ebx + TREKDATA.FUTURE5] |
fstp [ebx + TREKDATA.FUTURE6] |
fstp [ebx + TREKDATA.FUTURE7] |
cmp [ebx + TREKDATA.NSCREM], 0 |
je .allocate_objects |
fld [ebx + TREKDATA.DATE] |
fld [glb_dbl_0dot2777] |
faddp |
fstp [ebx + TREKDATA.FUTURE6] |
.allocate_objects: |
call TCommon_AllocateStars |
call TCommon_AllocateBases |
call TCommon_AllocateKlingons |
call TCommon_AllocateCommanders |
call TCommon_AllocatePlanets |
call TCommon_AllocateRomulans |
call TCommon_AllocateSuperCommander |
call TCommon_AllocateThing |
call TCommon_InitialMsg |
call TCommon_NewQuad |
mcEndLocals loc11.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TCommon.Inc |
---|
0,0 → 1,185 |
; -------------------------------------------------------------------------- |
; FILE: TCommon.Inc |
; DATE: October 4, 2008 |
; -------------------------------------------------------------------------- |
DEV_SR_SENSORS = 1 |
DEV_LR_SENSORS = 2 |
DEV_PHASERS = 3 |
DEV_PHOTON_TUBES = 4 |
DEV_LIFE_SUPPORT = 5 |
DEV_WARP_ENGINES = 6 |
DEV_IMPULSE_ENGINES = 7 |
DEV_SHIELDS = 8 |
DEV_SUBSPACE_RADIO = 9 |
DEV_SHUTTLE_CRAFT = 10 |
DEV_COMPUTER = 11 |
DEV_TRANSPORTER = 12 |
DEV_SHIELD_CONTROL = 13 |
DEV_DEATHRAY = 14 |
CONDITION_GREEN = 1 |
CONDITION_RED = 2 |
CONDITION_YELLOW = 3 |
CONDITION_DOCKED = 4 |
virtual at 0 |
TPlanet: |
.planet_X BYTE ? |
.planet_Y BYTE ? |
.planet_CLASS BYTE ? |
.planet_DILITHIUM BYTE ? |
.planet_SCANNED BYTE ? |
.size = $ |
end virtual |
virtual at 0 |
TREKDATA: |
.CRYPROB DOUBLE ? |
.DATE DOUBLE ? |
.REMRES DOUBLE ? |
.REMTIME DOUBLE ? |
.KPOWER DOUBLES 20 |
.KDIST DOUBLES 20 |
.DAMAGE DOUBLES 14 |
.INRESOR DOUBLE ? |
.INTIME DOUBLE ? |
.INENRG DOUBLE ? |
.INSHLD DOUBLE ? |
.INLSR DOUBLE ? |
.INDATE DOUBLE ? |
.ENERGY DOUBLE ? |
.SHLD DOUBLE ? |
.WARPFAC DOUBLE ? |
.WFACSQ DOUBLE ? |
.LSUPRES DOUBLE ? |
.DIST DOUBLE ? |
.DIREC DOUBLE ? |
.TIME DOUBLE ? |
.DOCKDATE DOUBLE ? |
.DAMFAC DOUBLE ? |
.FUTURE1 DOUBLE ? |
.FUTURE2 DOUBLE ? |
.FUTURE3 DOUBLE ? |
.FUTURE4 DOUBLE ? |
.FUTURE5 DOUBLE ? |
.FUTURE6 DOUBLE ? |
.FUTURE7 DOUBLE ? |
.HEIGHT DOUBLE ? |
; |
; Integer variables |
; |
align 4 |
.GALAXY INTEGERS 64 |
.STARCH INTEGERS 64 |
.INSTAR INT32 ? |
.REMKL BYTE ? |
.REMCOM BYTE ? |
.REMBASE BYTE ? |
.STARKL BYTE ? |
.BASEKL BYTE ? |
.KILLK BYTE ? |
.KILLC BYTE ? |
.CX BYTES 10 |
.CY BYTES 10 |
.BASEQX BYTES 5 |
.BASEQY BYTES 5 |
.NEWSTUF BYTES 64 |
.SCANNED BYTES 64 |
.PLNETS BYTES (10 * TPlanet.size) |
.ISX BYTE ? |
.ISY BYTE ? |
.KSTUF4 BYTE ? |
.KSTUF5 BYTE ? |
.NSCREM BYTE ? |
.NROMKL BYTE ? |
.NROMREM BYTE ? |
.NSCKILL BYTE ? |
.ICRYSTL BYTE ? |
.NPLANKL BYTE ? |
.QUAD BYTES 100 |
.KX BYTES 20 |
.KY BYTES 20 |
.INKLING BYTE ? |
.INBASE BYTE ? |
.INCOM BYTE ? |
.INTORPS BYTE ? |
.SHLDUP BYTE ? |
.CONDIT BYTE ? |
.TORPS BYTE ? |
.SHIP BYTE ? |
.QUADX BYTE ? |
.QUADY BYTE ? |
.SECTX BYTE ? |
.SECTY BYTE ? |
.ITHX BYTE ? |
.ITHY BYTE ? |
.ITHERE BYTE ? |
.LENGTH BYTE ? |
.SKILL BYTE ? |
.QTORPS BYTE ? |
.NPTUBES BYTE ? |
.PASSWD CHARS 12 |
.BASEX BYTE ? |
.BASEY BYTE ? |
.KLHERE BYTE ? |
.COMHERE BYTE ? |
.CASUAL BYTE ? |
.NHELP BYTE ? |
.NKINKS BYTE ? |
.IDIDIT BYTE ? |
.KDIDIT BYTE ? |
.KSHOT BYTE ? |
.GAMEWON BYTE ? |
.ALIVE BYTE ? |
.JUSTIN BYTE ? |
.RESTING BYTE ? |
.ALLDONE BYTE ? |
.SHLDCHG BYTE ? |
.THINGX BYTE ? |
.THINGY BYTE ? |
.PLNETX BYTE ? |
.PLNETY BYTE ? |
.INORBIT BYTE ? |
.LANDED BYTE ? |
.IPLANET BYTE ? |
.IMINE BYTE ? |
.INPLAN BYTE ? |
.NENHERE BYTE ? |
.ISHERE BYTE ? |
.NEUTZ BYTE ? |
.IRHERE BYTE ? |
.ICRAFT BYTE ? |
.IENTESC BYTE ? |
.ISCRAFT BYTE ? |
.ISATB BYTE ? |
.ISCATE BYTE ? |
.IPHWHO BYTE ? |
.BATX BYTE ? |
.BATY BYTE ? |
.ICSOS BYTE ? |
.ISSOS BYTE ? |
.ISUBDAM BYTE ? |
.SHUTUP BYTE ? |
.size = $ |
end virtual |
virtual at 0 |
TCommon: |
.SNAP BYTE ? |
.SNAPSHT BYTES TREKDATA.size |
align 16 |
.GAMEDB BYTES TREKDATA.size |
.size = $ |
end virtual |
macro mcLoadGameDataPtr r32 |
{ |
mov r32, [glb_pGameData] |
} |
PTCommon equ dd |
PTGameData equ dd |
; --- EOF --- |
/programs/games/StarTrek/trunk/TConsole.Asm |
---|
0,0 → 1,839 |
; -------------------------------------------------------------------------- |
; FILE: TConsole.Asm |
; DATE: September 21, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; CRAM3AS |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Cram3Asterisks: |
mcLoad8bitsToReg32 ecx, 181 |
call TConsole_Cram |
ret |
; -------------------------------------------------------------------------- |
; CRAMSHP |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramShip: |
mcLoadGameDataPtr ebx |
mcLoadMember al, TREKDATA.SHIP |
mcOnRegEqu al, CHAR_ENTERPRISE, .good_ship |
mcOnRegEqu al, CHAR_FQUEENE, .crappy_ship |
ret |
.good_ship: |
push 144 |
jmp .dump |
.crappy_ship: |
push 145 |
.dump: |
pop ecx |
call TConsole_Cram |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_ScrollUp: |
pushad |
mov ebx, [glb_pConsole] |
mov edi, ebx |
lea esi, [edi + TLine.size] |
mov ecx, TConsole.cons_LastRow |
rep movsb |
lea edi, [ebx + TConsole.cons_LastRow] |
mcZeroBits eax |
mov ecx, TLine.size |
rep stosb |
mcStoreMember TConsole.cons_CaretColumn, eax |
mov esi, eax |
call TApp_RefreshMainWndRect |
mov al, 0Dh |
call TLog_DumpChar |
mov al, 0Ah |
call TLog_DumpChar |
popad |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_RefreshCaretLine: |
mcBeginLocals RECT.size |
mov esi, esp |
invoke GetClientRect, [glb_MainWnd], esi |
mov eax, [esi + RECT.rc_Bottom] |
sub eax, dword [glb_CharSize + SIZE.size_Height] |
dec eax |
mov [esi + RECT.rc_Top], eax |
call TApp_RefreshMainWndRect |
mcEndLocals RECT.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Backspace: |
mov ebx, [glb_pConsole] |
cmp [ebx + TConsole.cons_CaretColumn], 0 |
je .done |
dec [ebx + TConsole.cons_CaretColumn] |
mcZeroBits eax |
call TConsole_PutChar |
dec [ebx + TConsole.cons_CaretColumn] |
call TConsole_RefreshCaretLine |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = character code |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_PutChar: |
mov ebx, [glb_pConsole] |
cmp [ebx + TConsole.cons_CaretColumn], CONSOLE_LAST_COL |
jae .done |
mcLoadMember ecx, TConsole.cons_CaretColumn |
inc [ebx + TConsole.cons_CaretColumn] |
imul ecx, TCharacter.size |
lea edi, [ebx + ecx + TConsole.cons_LastRow] |
mcLoadMember edx, TConsole.cons_ActiveColor |
mov [edi + TCharacter.char_Symbol], al |
mov [edi + TCharacter.char_Attribute], dl |
pushad |
call TLog_DumpChar |
popad |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = index of color |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_SetAttr: |
cmp cl, CONSOLE_ATTRS |
jae .done |
and ecx, 0FFh |
push ebx |
mov ebx, [glb_pConsole] |
mcStoreMember TConsole.cons_ActiveColor, ecx |
pop ebx |
.done: |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_SetGameMsgAttr: |
mov cl, ATTR_GAME_MSG |
call TConsole_SetAttr |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_SetCrewMsgAttr: |
mov cl, ATTR_CREW_MSG |
call TConsole_SetAttr |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = character code |
; CL = number of characters |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_RepeatChar: |
and ecx, 0FFh |
.next: |
push ecx |
call TConsole_PutChar |
pop ecx |
loop .next |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = number of characters |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_RepeatBlank: |
mov al, CHAR_BLANK |
call TConsole_RepeatChar |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = number of characters |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_RepeatAsterisk: |
mov al, CHAR_ASTERISK |
call TConsole_RepeatChar |
ret |
; -------------------------------------------------------------------------- |
; SUBROUTINE CRAM from original FORTRAN source |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of the message table |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Cram: |
call TMsgTable_GetItem |
mcZeroBits eax |
.get_char: |
lodsb |
mcOnRegZero eax, .done |
call TConsole_PutChar |
jmp .get_char |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = UNICODE text |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramWide: |
mcZeroBits eax |
.get_char: |
lodsw |
mcOnRegZero eax, .done |
call TConsole_PutChar |
jmp .get_char |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = ANSI text |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramAnsi: |
mcZeroBits eax |
.get_char: |
lodsb |
mcOnRegZero eax, .done |
call TConsole_PutChar |
jmp .get_char |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of the message table |
; DL = field width |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramString: |
movzx edx, dl |
call TMsgTable_GetLength |
cmp eax, edx |
jae .cram_and_exit |
sub edx, eax |
push edx |
call TConsole_Cram |
pop ecx |
call TConsole_RepeatBlank |
ret |
.cram_and_exit: |
call TConsole_Cram |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = 1-based device index (like DEV_IMPULSE_ENGINES) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramDevice: |
movzx ecx, cl |
add ecx, 59 |
call TConsole_Cram |
ret |
; -------------------------------------------------------------------------- |
; CRAMEN |
; -------------------------------------------------------------------------- |
; Input: |
; AL = object symbol |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramEnemy: |
pushad |
mov edi, glb_ObjectMap |
mcLoad8bitsToReg32 ecx, 9 |
mov edx, edi |
repne scasb |
jne .done |
.cram_it: |
sub edi, edx |
lea ecx, [edi + 202] |
call TConsole_Cram |
.done: |
popad |
ret |
; -------------------------------------------------------------------------- |
; CRMSENA |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate |
; DL = Y coordinate |
; CL = 1 for "QUADRANT", 2 for "SECTOR", 0 for none |
; BL = Enemy character |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramEnemyAt: |
push eax ecx edx |
mov al, bl |
call TConsole_CramEnemy |
mov ecx, 257 |
call TConsole_Cram |
pop edx ecx eax |
call TConsole_CramLoc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = sector X coordinate |
; DL = sector Y coordinate |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramEnemyAtEx: |
push ebx |
call TArray_QuadPtr |
mov bl, [ebx] |
mov cl, 2 |
call TConsole_CramEnemyAt |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = Int32 value to print |
; CL = field width or zero (value is padded with blanks on the left side) |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc19: |
.bufInt32 CHARS 12 |
.nWidth COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramIntWidth: |
mcBeginLocals loc19.size |
movzx ecx, cl |
mcStoreLocal loc19.nWidth, ecx |
mcLoadLocalRef edi, loc19.bufInt32 |
call TFormat_Int32 |
cmp [esp + loc19.nWidth], 0 |
je .dump |
cmp [esp + loc19.nWidth], ecx |
jbe .dump |
sub ecx, [esp + loc19.nWidth] |
neg ecx |
call TConsole_RepeatBlank |
.dump: |
mcLoadLocalRef esi, loc19.bufInt32 |
mcZeroBits eax |
.next: |
lodsb |
mcOnRegZero eax, .done |
call TConsole_PutChar |
jmp .next |
.done: |
mcEndLocals loc19.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = Int32 value to print |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramInt: |
pushad |
mcZeroBits ecx |
call TConsole_CramIntWidth |
popad |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = message table index |
; EAX = Int32 value to print |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramSinglePlural: |
push eax ecx |
call TConsole_CramInt |
mov al, CHAR_BLANK |
call TConsole_PutChar |
pop ecx |
call TConsole_Cram |
pop eax |
cmp al, 1 |
je .done |
mov al, 'S' |
call TConsole_PutChar |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X coordinate |
; DL = Y coordinate |
; CL = KEY (1 - print "QUADRANT", 2 - print "SECTOR") |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc21: |
.nIX INT32 ? |
.nIY INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramLoc: |
mcBeginLocals loc21.size |
movzx eax, al |
movzx edx, dl |
mcStoreLocal loc21.nIX, eax |
mcStoreLocal loc21.nIY, edx |
mcOnRegZero cl, .print_values |
add cl, 56 |
movzx ecx, cl |
call TConsole_Cram |
.print_values: |
mov al, CHAR_BLANK |
call TConsole_PutChar |
mcLoadLocal eax, loc21.nIX |
call TConsole_CramInt |
mcLoad8bitsToReg32 ecx, 59 |
call TConsole_Cram |
mcLoadLocal eax, loc21.nIY |
call TConsole_CramInt |
mcEndLocals loc21.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = value to print |
; CL = precision |
; DL = field width or zero |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc20: |
.bufDouble CHARS 16 |
.nWidth COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramFloatWidth: |
mcBeginLocals loc20.size |
movzx edx, dl |
mcStoreLocal loc20.nWidth, edx |
mcLoadLocalRef edi, loc20.bufDouble |
call TFormat_Double |
cmp [esp + loc20.nWidth], 0 |
je .dump |
cmp [esp + loc20.nWidth], ecx |
jbe .dump |
sub ecx, [esp + loc20.nWidth] |
neg ecx |
call TConsole_RepeatBlank |
.dump: |
mcLoadLocalRef esi, loc20.bufDouble |
mcZeroBits eax |
.next: |
lodsb |
mcOnRegZero eax, .done |
call TConsole_PutChar |
jmp .next |
.done: |
mcEndLocals loc20.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = value to print |
; CL = precision |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_CramFloat: |
pushad |
mcZeroBits edx |
call TConsole_CramFloatWidth |
popad |
ret |
; -------------------------------------------------------------------------- |
; SUBROUTINE PROUT from original FORTRAN source |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of the message table |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Prout: |
push ecx |
call TConsole_Cram |
call TConsole_ScrollUp |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = number of lines to skip |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Skip: |
movzx ecx, cl |
.skipping: |
push ecx |
call TConsole_ScrollUp |
pop ecx |
loop .skipping |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of the message table |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_ProutGameMsg: |
push ecx |
call TConsole_SetGameMsgAttr |
pop ecx |
call TConsole_Prout |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; CL = index of color |
; Output: |
; EAX = COLORREF at the specified index |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_GetColorAtIndex: |
mcLoadRGB eax, 255, 0, 0 |
cmp cl, CONSOLE_ATTRS |
jae .done |
and ecx, 0FFh |
mov ebx, [glb_pConsole] |
mov eax, [ebx + 4*ecx + TConsole.cons_Attributes] |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDX = HDC |
; EAX = Y coordinate |
; ESI = address of TLine structure |
; ECX = number of lines left in the loop |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc2: |
.hDC HDC ? |
.yText INT32 ? |
.xText INT32 ? |
.pTChar PTCharacter ? |
.rgbNow COLORREF ? |
.strOneChar WCHARS 2 |
.nLinesLeft COUNT ? |
.rect_Caret rb RECT.size |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_DrawLine: |
mcBeginLocals loc2.size |
mcStoreLocal loc2.nLinesLeft, ecx |
mcStoreLocal loc2.hDC, edx |
mcStoreLocal loc2.yText, eax |
mcStoreLocal loc2.pTChar, esi |
mcZeroBits eax |
mcStoreLocal loc2.rgbNow, eax |
inc eax |
mcStoreLocal loc2.xText, eax |
.load_char: |
mcLoadLocal esi, loc2.pTChar |
cmp [esi + TCharacter.char_Symbol], 0 |
je .draw_caret |
movzx eax, [esi + TCharacter.char_Symbol] |
mov [esp + loc2.strOneChar], ax |
mov cl, [esi + TCharacter.char_Attribute] |
call TConsole_GetColorAtIndex |
mcLoadLocal edi, loc2.hDC |
cmp [esp + loc2.rgbNow], eax |
je .draw_char |
mcStoreLocal loc2.rgbNow, eax |
invoke SetTextColor, edi, eax |
.draw_char: |
mov ebx, esp |
lea esi, [ebx + loc2.strOneChar] |
invoke TextOut, edi, \ |
[ebx + loc2.xText], \ |
[ebx + loc2.yText], esi, 1 |
add [ebx + loc2.pTChar], TCharacter.size |
mov eax, dword [glb_CharSize + SIZE.size_Width] |
add [ebx + loc2.xText], eax |
jmp .load_char |
.draw_caret: |
cmp [esp + loc2.nLinesLeft], 1 |
jne .done |
; |
; Paint a rectangular caret |
; |
mov ebx, esp |
mcLoadMemberRef edi, loc2.rect_Caret |
mcLoadMember edx, loc2.xText |
mcLoadMember eax, loc2.yText |
mov [edi + RECT.rc_Left], edx |
mov [edi + RECT.rc_Top], eax |
mov esi, glb_CharSize |
add edx, [esi + SIZE.size_Width] |
add eax, [esi + SIZE.size_Height] |
mov [edi + RECT.rc_Right], edx |
mov [edi + RECT.rc_Bottom], eax |
mov cl, ATTR_PROMPT_VALUE |
call TConsole_GetColorAtIndex |
invoke CreateSolidBrush, eax |
mov esi, eax |
mcLoadLocal edx, loc2.hDC |
mcLoadLocalRef edi, loc2.rect_Caret |
inc [edi + RECT.rc_Left] |
inc [edi + RECT.rc_Right] |
invoke FillRect, edx, edi, eax |
invoke DeleteObject, esi |
.done: |
mcEndLocals loc2.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDX = HDC |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc3: |
.hDC HDC ? |
.yText INT32 ? |
.pLineOfChars PTLine ? |
.nLines COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_DrawAllLines: |
mcBeginLocals loc3.size |
mcStoreLocal loc3.hDC, edx |
mcLoad1 eax |
mcStoreLocal loc3.yText, eax |
mov ebx, [glb_pConsole] |
mcStoreLocal loc3.pLineOfChars, ebx |
mcLoad8bitsToReg32 ecx, CONSOLE_ROWS |
mcStoreLocal loc3.nLines, ecx |
.paint_row: |
mcLoadLocal edx, loc3.hDC |
mcLoadLocal eax, loc3.yText |
mcLoadLocal esi, loc3.pLineOfChars |
mcLoadLocal ecx, loc3.nLines |
call TConsole_DrawLine |
add [esp + loc3.pLineOfChars], TLine.size |
mov eax, dword [glb_CharSize + SIZE.size_Height] |
add [esp + loc3.yText], eax |
dec [esp + loc3.nLines] |
jnz .paint_row |
mcEndLocals loc3.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TConsole_Create: |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TConsole.size |
mov [glb_pConsole], eax |
mov edi, eax |
mov ecx, TConsole.size |
mcZeroBits eax |
push edi |
rep stosb |
pop esi |
; |
; Init palette |
; |
lea edi, [esi + TConsole.cons_Attributes] |
mcLoadRGB eax, 128, 191, 255 |
stosd ; ATTR_GAME_MSG |
mcLoadRGB eax, 255, 255, 206 |
stosd ; ATTR_CREW_MSG |
mcLoadRGB eax, 94, 174, 174 |
stosd ; ATTR_KLINGON |
mcLoadRGB eax, 0, 176, 0 |
stosd ; ATTR_ROMULAN |
mcLoadRGB eax, 192, 192, 192 |
stosd ; ATTR_COSMOS |
mcLoadRGB eax, 255, 255, 255 |
stosd ; ATTR_SHIP |
mcLoadRGB eax, 255, 255, 0 |
stosd ; ATTR_STAR |
mcLoadRGB eax, 6, 131, 255 |
stosd ; ATTR_BASE |
mcLoadRGB eax, 128, 128, 64 |
stosd ; ATTR_THOLIAN |
mcLoadRGB eax, 128, 128, 128 |
stosd ; ATTR_BLACK_HOLE |
mcLoadRGB eax, 230, 211, 157 |
stosd ; ATTR_PLANET |
mcLoadRGB eax, 0, 128, 255 |
stosd ; ATTR_REPORT_TEXT |
mcLoadRGB eax, 62, 158, 255 |
stosd ; ATTR_REPORT_VALUE |
mcLoadRGB eax, 248, 108, 41 |
stosd ; ATTR_GALAXY_EDGE |
mcLoadRGB eax, 149, 255, 202 |
stosd ; ATTR_SHIP_QUAD |
mcLoadRGB eax, 174, 194, 247 |
stosd ; ATTR_SCANNED_QUAD |
mcLoadRGB eax, 218, 191, 5 |
stosd ; ATTR_SCAN_SCALE |
mcLoadRGB eax, 255, 170, 170 |
stosd ; ATTR_HIT_DAMAGE |
mcLoadRGB eax, 181, 181, 106 |
stosd ; ATTR_WEB |
mcLoadRGB eax, 46, 170, 43 |
stosd ; ATTR_COND_GREEN |
mcLoadRGB eax, 255, 255, 130 |
stosd ; ATTR_COND_YELLOW |
mcLoadRGB eax, 255, 73, 64 |
stosd ; ATTR_COND_RED |
mcLoadRGB eax, 0, 155, 0 |
stosd ; ATTR_PROMPT_TEXT |
mcLoadRGB eax, 73, 231, 69 |
stosd ; ATTR_PROMPT_VALUE |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TConsole.Inc |
---|
0,0 → 1,63 |
; -------------------------------------------------------------------------- |
; FILE: TConsole.Inc |
; DATE: September 21, 2008 |
; -------------------------------------------------------------------------- |
CONSOLE_ROWS = 40 |
CONSOLE_COLS = 80 |
CONSOLE_ATTRS = 24 |
CONSOLE_LAST_COL = (CONSOLE_COLS - 1) |
; -------------------------------------------------------------------------- |
ATTR_GAME_MSG = 0 |
ATTR_CREW_MSG = 1 |
ATTR_KLINGON = 2 |
ATTR_ROMULAN = 3 |
ATTR_COSMOS = 4 |
ATTR_SHIP = 5 |
ATTR_STAR = 6 |
ATTR_BASE = 7 |
ATTR_THOLIAN = 8 |
ATTR_BLACK_HOLE = 9 |
ATTR_PLANET = 10 |
ATTR_REPORT_TEXT = 11 |
ATTR_REPORT_VALUE = 12 |
ATTR_GALAXY_EDGE = 13 |
ATTR_SHIP_QUAD = 14 |
ATTR_SCANNED_QUAD = 15 |
ATTR_SCAN_SCALE = 16 |
ATTR_HIT_DAMAGE = 17 |
ATTR_WEB = 18 |
ATTR_COND_GREEN = 19 |
ATTR_COND_YELLOW = 20 |
ATTR_COND_RED = 21 |
ATTR_PROMPT_TEXT = 22 |
ATTR_PROMPT_VALUE = 23 |
; -------------------------------------------------------------------------- |
virtual at 0 |
TCharacter: |
.char_Symbol db ? |
.char_Attribute db ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
virtual at 0 |
TLine: |
.cons_Symbols rb (TCharacter.size * CONSOLE_COLS) |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
virtual at 0 |
TConsole: |
.cons_Rows rb (TLine.size * (CONSOLE_ROWS - 1)) |
.cons_LastRow rb TLine.size |
.cons_CaretColumn INDEX ? |
.cons_ActiveColor INDEX ? |
.cons_Attributes COLORREFS CONSOLE_ATTRS |
.size = $ |
end virtual |
; --- EOF --- |
/programs/games/StarTrek/trunk/TDock.Asm |
---|
0,0 → 1,848 |
; -------------------------------------------------------------------------- |
; FILE: TDock.Asm |
; DATE: October 25, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; ABANDON |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc86: |
.pTrekData PVOID ? |
.nAttempts COUNT ? |
.dbl_ShuttleDamage DOUBLE ? |
.dbl_padding DOUBLE ? |
.nBaseSectorX INT32 ? |
.nBaseSectorY INT32 ? |
.nFQSectorX INT32 ? |
.nFQSectorY INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_Abandon: |
mcBeginLocals loc86.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc86.pTrekData, esi |
mov cl, DEV_SHUTTLE_CRAFT |
call TArray_GetDblDamage |
fstp [esp + loc86.dbl_ShuttleDamage] |
fld [esp + loc86.dbl_ShuttleDamage] |
fldz |
mc_CMP_ST0_ST1 |
jc .L10 |
jz .L15 |
fld [esp + loc86.dbl_ShuttleDamage] |
fld1 |
fchs |
mc_CMP_ST0_ST1 |
jz .L6 |
mov ecx, 443 |
call TConsole_ProutGameMsg |
jmp .done |
.L6: |
mov ecx, 444 |
call TConsole_ProutGameMsg |
jmp .done |
.L10: |
mov ecx, 445 |
call TConsole_ProutGameMsg |
jmp .done |
.L15: |
mcLoadLocal esi, loc86.pTrekData |
cmp [esi + TREKDATA.LANDED], 1 |
jne .check1 |
.must_be_aboard: |
mov ecx, 675 |
call TConsole_ProutGameMsg |
jmp .done |
.check1: |
cmp [esi + TREKDATA.ICRAFT], 1 |
je .must_be_aboard |
cmp [esi + TREKDATA.ISCRAFT], 1 |
je .L17 |
mov ecx, 674 |
call TConsole_ProutGameMsg |
jmp .done |
.L17: |
call TConsole_ScrollUp |
mov cl, ATTR_COND_RED |
call TConsole_SetAttr |
mov ecx, 676 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
call TConsole_ScrollUp |
invoke Sleep, 800 |
mov ecx, 678 |
call TConsole_ProutGameMsg |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mcLoadLocal esi, loc86.pTrekData |
cmp [esi + TREKDATA.REMBASE], 0 |
je .finished |
invoke Sleep, 800 |
call TConsole_ScrollUp |
mov ecx, 681 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mcLoadLocal esi, loc86.pTrekData |
mcZeroBits eax |
mov [esi + TREKDATA.ICRYSTL], al |
mov [esi + TREKDATA.IMINE], al |
mov [esi + TREKDATA.ISCATE], al |
movzx edx, [esi + TREKDATA.REMBASE] |
call TRandom_IRan |
mov ecx, eax |
mcLoadLocal ebx, loc86.pTrekData |
mcLoadMemberRef esi, TREKDATA.BASEQX |
mcLoadMemberRef edi, TREKDATA.BASEQY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcStoreMember TREKDATA.QUADX, al |
mcStoreMember TREKDATA.QUADY, dl |
.L40: |
mov al, 5 |
mcStoreMember TREKDATA.SECTX, al |
mcStoreMember TREKDATA.SECTY, al |
call TCommon_NewQuad |
mov al, 5 |
mov dl, al |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
; |
; Three attempts to put F.Q. beside the base |
; |
mcLoad8bitsToReg32 eax, 3 |
mcStoreLocal loc86.nAttempts, eax |
mcLoadLocal esi, loc86.pTrekData |
movzx eax, [esi + TREKDATA.BASEX] |
movzx edx, [esi + TREKDATA.BASEY] |
mcStoreLocal loc86.nBaseSectorX, eax |
mcStoreLocal loc86.nBaseSectorY, edx |
.attempt: |
mcLoad8bitsToReg32 edx, 3 |
call TRandom_IRan |
dec eax |
add eax, [esp + loc86.nBaseSectorX] |
mcStoreLocal loc86.nFQSectorX, eax |
call TPhotons_IsValidSector |
jnc .next_attempt |
mcLoad8bitsToReg32 edx, 3 |
call TRandom_IRan |
dec eax |
add eax, [esp + loc86.nBaseSectorY] |
mcStoreLocal loc86.nFQSectorY, eax |
call TPhotons_IsValidSector |
jnc .next_attempt |
mcLoadLocal eax, loc86.nFQSectorX |
mcLoadLocal edx, loc86.nFQSectorY |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
je .L60 |
.next_attempt: |
dec [esp + loc86.nAttempts] |
jnz .attempt |
jmp .L40 |
.L60: |
mov byte [ebx], CHAR_FQUEENE |
mcLoadLocal esi, loc86.pTrekData |
mov [esi + TREKDATA.SHIP], CHAR_FQUEENE |
mov [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
mcLoadLocal eax, loc86.nFQSectorX |
mcLoadLocal edx, loc86.nFQSectorY |
mov [esi + TREKDATA.SECTX], al |
mov [esi + TREKDATA.SECTY], dl |
lea edi, [esi + TREKDATA.DAMAGE] |
mcLoad8bitsToReg32 ecx, 14 |
.clear_damages: |
fldz |
fstp tbyte [edi] |
add edi, 10 |
loop .clear_damages |
fld [glb_dbl_3000] |
fld st |
fstp [esi + TREKDATA.INENRG] |
fstp [esi + TREKDATA.ENERGY] |
fld [glb_dbl_1250] |
fld st |
fstp [esi + TREKDATA.INSHLD] |
fstp [esi + TREKDATA.SHLD] |
mov al, 6 |
mov [esi + TREKDATA.INTORPS], al |
mov [esi + TREKDATA.TORPS], al |
fld [glb_dbl_3] |
fld st |
fstp [esi + TREKDATA.INLSR] |
fstp [esi + TREKDATA.LSUPRES] |
mov [esi + TREKDATA.SHLDUP], 0 |
fld [glb_dbl_5] |
fstp [esi + TREKDATA.WARPFAC] |
fld [glb_dbl_25] |
fstp [esi + TREKDATA.WFACSQ] |
jmp .done |
.finished: |
mov al, 9 |
call TFinish_Main |
.done: |
mcEndLocals loc86.size |
ret |
; -------------------------------------------------------------------------- |
; DREPORT |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc38: |
.nJDAM INT32 ? |
.pDAMAGE PDOUBLE ? |
.nL INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_DamageReport: |
mcBeginLocals loc38.size |
mcZeroBits eax |
mcStoreLocal loc38.nJDAM, eax |
inc eax |
mcStoreLocal loc38.nL, eax |
mcLoadGameDataPtr esi |
add esi, TREKDATA.DAMAGE |
mcStoreLocal loc38.pDAMAGE, esi |
.check_device: |
fldz |
mcLoadLocal ebx, loc38.pDAMAGE |
fld tbyte [ebx] |
mc_CMP_ST0_ST1 |
jc .L20 |
jz .L20 |
cmp [esp + loc38.nJDAM], 0 |
jne .L10 |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
call TConsole_ScrollUp |
mov ecx, 270 |
call TConsole_Prout |
mov ecx, 271 |
call TConsole_Prout |
inc [esp + loc38.nJDAM] |
.L10: |
mov cl, 2 |
call TConsole_RepeatBlank |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
mov dl, 22 |
mcLoadLocal ecx, loc38.nL |
add ecx, 59 |
call TConsole_CramString |
mov cl, ATTR_REPORT_VALUE |
call TConsole_SetAttr |
cmp [esp + loc38.nL], 14 |
je .deathray |
mcLoadLocal esi, loc38.pDAMAGE |
fld tbyte [esi] |
fld [glb_dbl_0dot005] |
faddp |
mov cl, 2 |
mov dl, 5 |
call TConsole_CramFloatWidth |
jmp .docked_value |
.deathray: |
mov ecx, 269 |
call TConsole_Cram |
.docked_value: |
mcLoadLocal esi, loc38.pDAMAGE |
fld tbyte [esi] |
fld [glb_dbl_DOCKFAC] |
fmulp |
fld [glb_dbl_0dot005] |
faddp |
mov cl, 2 |
mov dl, 10 |
call TConsole_CramFloatWidth |
call TConsole_ScrollUp |
.L20: |
; |
; Next device |
; |
add [esp + loc38.pDAMAGE], 10 |
inc [esp + loc38.nL] |
cmp [esp + loc38.nL], 14 |
jbe .check_device |
cmp [esp + loc38.nJDAM], 0 |
jne .done |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 268 |
call TConsole_Prout |
.done: |
call TConsole_ScrollUp |
mcEndLocals loc38.size |
ret |
; -------------------------------------------------------------------------- |
; This function will check if sufficient time passed between dockings to |
; prevent the cheating by docking a few times in a row and getting |
; additional photon tubes, quantum charges, etc. |
; -------------------------------------------------------------------------- |
; Returns CF=1 if additional devices are allowed. |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_IsTime4Goodies: |
mcLoadGameDataPtr esi |
fld [esi + TREKDATA.DATE] |
fld [esi + TREKDATA.DOCKDATE] |
fsubp |
fld [glb_dbl_0dot8] |
mc_CMP_ST0_ST1 |
ret |
; -------------------------------------------------------------------------- |
; Check if enhanced torpedoes available |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_GetQuantumCharges: |
call TDock_IsTime4Goodies |
jnc .done |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.QTORPS], 1 |
je .done |
cmp [esi + TREKDATA.SKILL], 5 |
jb .done |
mcLoad8bitsToReg32 edx, 100 |
call TRandom_IRan |
inc eax |
cmp eax, 25 |
ja .done |
mcLoadGameDataPtr edi |
inc [edi + TREKDATA.QTORPS] |
mcZeroBits ecx |
cmp [edi + TREKDATA.SHIP], CHAR_ENTERPRISE |
sete cl |
mov al, 8 |
shl al, cl |
mov [edi + TREKDATA.TORPS], al |
.report: |
call TConsole_SetCrewMsgAttr |
mov ecx, 707 |
call TConsole_Prout |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Check if additional photon tubes were installed |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_InstallTubes: |
mcBeginLocals 4 |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.SKILL], 5 |
jb .done |
cmp [esi + TREKDATA.NPTUBES], 3 |
ja .done |
mcLoad8bitsToReg32 edx, 100 |
call TRandom_IRan |
inc eax |
cmp eax, 20 |
ja .done |
call TRandom_Ranf |
fld [glb_dbl_3] |
fmulp |
call TCommon_FP_Truncate |
inc eax |
mov [esp], eax |
mcLoadGameDataPtr edi |
add [edi + TREKDATA.NPTUBES], al |
call TConsole_SetCrewMsgAttr |
mov ecx, 701 |
call TConsole_Cram |
mov eax, [esp] |
call TConsole_CramInt |
mov ecx, 702 |
call TConsole_Cram |
cmp dword [esp], 1 |
je .skip |
mov al, 'S' |
call TConsole_PutChar |
.skip: |
mov ecx, 703 |
call TConsole_Prout |
.done: |
mcEndLocals 4 |
ret |
; -------------------------------------------------------------------------- |
; DOCK |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_Main: |
call TConsole_SetGameMsgAttr |
mcLoadGameDataPtr esi |
mov [esi + TREKDATA.IDIDIT], 0 |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L30 |
cmp [esi + TREKDATA.INORBIT], 0 |
jne .L40 |
cmp [esi + TREKDATA.BASEX], 0 |
je .L5 |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
sub al, [esi + TREKDATA.BASEX] |
sub dl, [esi + TREKDATA.BASEY] |
movsx eax, al |
movsx edx, dl |
call TCommon_AbsEAX |
cmp eax, 1 |
ja .L5 |
mov eax, edx |
call TCommon_AbsEAX |
cmp eax, 1 |
jbe .L10 |
.L5: |
call TConsole_CramShip |
mov ecx, 264 |
jmp .msg_end |
.L10: |
mcLoadGameDataPtr edi |
mov [edi + TREKDATA.CONDIT], CONDITION_DOCKED |
mov ecx, 265 |
call TConsole_Prout |
call TDock_InstallTubes |
call TDock_GetQuantumCharges |
mcLoadGameDataPtr edi |
inc [edi + TREKDATA.IDIDIT] |
fld [edi + TREKDATA.INSHLD] |
fstp [edi + TREKDATA.SHLD] |
fld [edi + TREKDATA.INLSR] |
fstp [edi + TREKDATA.LSUPRES] |
cmp [edi + TREKDATA.QTORPS], 1 |
je .check_power |
mov al, [edi + TREKDATA.INTORPS] |
mov [edi + TREKDATA.TORPS], al |
.check_power: |
fld [edi + TREKDATA.INENRG] |
fld [edi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .refuel |
ret |
.refuel: |
fld [edi + TREKDATA.INENRG] |
fstp [edi + TREKDATA.ENERGY] |
ret |
.L30: |
mov ecx, 266 |
jmp .msg_end |
.L40: |
mov ecx, 267 |
.msg_end: |
call TConsole_Prout |
mcLoadGameDataPtr esi |
fld [esi + TREKDATA.DATE] |
fstp [esi + TREKDATA.DOCKDATE] |
ret |
; -------------------------------------------------------------------------- |
; HELP |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc49: |
.pTrekData PVOID ? |
.dbl_DIST DOUBLE ? |
.dbl_XDIST DOUBLE ? |
.dbl_TEMP1 DOUBLE ? |
.dbl_TEMP2 DOUBLE ? |
.dbl_PROBF DOUBLE ? |
.nIX BYTE ? |
.nIY BYTE ? |
.nLINE INDEX ? |
.nL INDEX ? |
.nLL INDEX ? |
.nSUM INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TDock_Help: |
mcBeginLocals loc49.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc49.pTrekData, esi |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L10 |
call TConsole_SetCrewMsgAttr |
mov ecx, 562 |
call TConsole_Prout |
jmp .done |
.L10: |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jnc .L20 |
mov ecx, 563 |
call TConsole_ProutGameMsg |
jmp .done |
.L20: |
mcLoadLocal esi, loc49.pTrekData |
cmp [esi + TREKDATA.REMBASE], 0 |
jne .L30 |
call TConsole_SetCrewMsgAttr |
mov ecx, 564 |
call TConsole_Prout |
jmp .done |
.L30: |
cmp [esi + TREKDATA.LANDED], 1 |
jne .L31 |
call TConsole_SetGameMsgAttr |
mov ecx, 565 |
call TConsole_Cram |
call TConsole_CramShip |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
jmp .done |
.L31: |
cmp [esi + TREKDATA.ISCRAFT], 0 |
jne .L32 |
mov ecx, 407 |
call TConsole_ProutGameMsg |
jmp .done |
.L32: |
inc [esi + TREKDATA.NHELP] |
cmp [esi + TREKDATA.BASEX], 0 |
je .L40 |
mov al, [esi + TREKDATA.BASEX] |
sub al, [esi + TREKDATA.SECTX] |
movzx eax, al |
imul eax, eax |
mov dl, [esi + TREKDATA.BASEY] |
sub dl, [esi + TREKDATA.SECTY] |
movzx edx, dl |
imul edx, edx |
add eax, edx |
call TCommon_FPU_Load_EAX |
fsqrt |
fstp [esp + loc49.dbl_DIST] |
jmp .L60 |
.L40: |
fld [glb_dbl_1000] |
fstp [esp + loc49.dbl_DIST] |
movzx ecx, [esi + TREKDATA.REMBASE] |
lea edi, [esi + TREKDATA.BASEQX] |
lea ebx, [esi + TREKDATA.BASEQY] |
mcZeroBits edx |
.check_base_distance: |
mov al, [edi] |
sub al, [esi + TREKDATA.QUADX] |
movsx eax, al |
imul eax, eax |
mcStoreLocal loc49.nSUM, eax |
mov al, [ebx] |
sub al, [esi + TREKDATA.QUADY] |
movsx eax, al |
imul eax, eax |
add eax, [esp + loc49.nSUM] |
call TCommon_FPU_Load_EAX |
fsqrt |
fld [glb_dbl_Ten] |
fmulp |
fld st |
fstp [esp + loc49.dbl_XDIST] |
fld [esp + loc49.dbl_DIST] |
mc_CMP_ST0_ST1 |
jc .next_base |
fld [esp + loc49.dbl_XDIST] |
fstp [esp + loc49.dbl_DIST] |
mcStoreLocal loc49.nLINE, edx |
.next_base: |
inc edi |
inc ebx |
inc edx |
loop .check_base_distance |
lea edi, [esi + TREKDATA.BASEQX] |
lea ebx, [esi + TREKDATA.BASEQY] |
mcLoadLocal ecx, loc49.nLINE |
mov al, [edi + ecx] |
mov dl, [ebx + ecx] |
mov [esi + TREKDATA.QUADX], al |
mov [esi + TREKDATA.QUADY], dl |
inc [esi + TREKDATA.SHUTUP] |
push esi |
call TCommon_NewQuad |
pop esi |
dec [esi + TREKDATA.SHUTUP] |
.L60: |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
call TConsole_SetGameMsgAttr |
mov ecx, 199 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal esi, loc49.pTrekData |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TConsole_CramLoc |
mov ecx, 566 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 567 |
call TConsole_Prout |
mov esi, glb_dbl_0dot98 |
mcLoadLocalRef edi, loc49.dbl_DIST |
call TCommon_X_exp_Y |
fld1 |
fsubrp |
fstp [esp + loc49.dbl_TEMP1] |
fld1 |
fld [glb_dbl_3] |
fdivp |
fstp [esp + loc49.dbl_TEMP2] |
mcLoadLocalRef esi, loc49.dbl_TEMP1 |
mcLoadLocalRef edi, loc49.dbl_TEMP2 |
call TCommon_X_exp_Y |
fstp [esp + loc49.dbl_PROBF] |
mcLoad1 eax |
mcStoreLocal loc49.nL, eax |
call TConsole_SetGameMsgAttr |
.attempt: |
mov ecx, 567 |
add ecx, [esp + loc49.nL] |
call TConsole_Cram |
mov ecx, 571 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 572 |
call TConsole_Cram |
invoke Sleep, 1200 |
call TRandom_Ranf |
fld [esp + loc49.dbl_PROBF] |
mc_CMP_ST0_ST1 |
jc .L90 |
.L70: |
mov ecx, 573 |
call TConsole_Prout |
inc [esp + loc49.nL] |
cmp [esp + loc49.nL], 3 |
jbe .attempt |
mov al, 11 |
call TFinish_Main |
jmp .done |
.L90: |
mcLoad1 eax |
mcStoreLocal loc49.nLL, eax |
mcLoadLocal esi, loc49.pTrekData |
.find_adjacent_pos: |
call TRandom_Ranf |
fld [glb_dbl_3] |
fmulp |
call TCommon_FP_Truncate |
add al, [esi + TREKDATA.BASEX] |
dec eax |
call TPhotons_IsValidSector |
jnc .next_adjacent_try |
mcStoreLocal loc49.nIX, al |
call TRandom_Ranf |
fld [glb_dbl_3] |
fmulp |
call TCommon_FP_Truncate |
add al, [esi + TREKDATA.BASEY] |
dec eax |
call TPhotons_IsValidSector |
jnc .next_adjacent_try |
mcStoreLocal loc49.nIY, al |
mcLoadLocal al, loc49.nIX |
mcLoadLocal dl, loc49.nIY |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
je .L110 |
.next_adjacent_try: |
inc [esp + loc49.nLL] |
cmp [esp + loc49.nLL], 5 |
jbe .find_adjacent_pos |
jmp .L70 |
.L110: |
push ebx |
mov ecx, 574 |
call TConsole_Prout |
pop ebx |
mcLoadLocal esi, loc49.pTrekData |
mcLoadLocal al, loc49.nIX |
mcLoadLocal dl, loc49.nIY |
mov [esi + TREKDATA.SECTX], al |
mov [esi + TREKDATA.SECTY], dl |
mov al, [esi + TREKDATA.SHIP] |
mov byte [ebx], al |
call TCommon_ResetDist |
call TCommon_SortKlingons |
call TDock_Main |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 575 |
call TConsole_Prout |
.done: |
mcEndLocals loc49.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TEvents.Asm |
---|
0,0 → 1,1931 |
; -------------------------------------------------------------------------- |
; FILE: TEvents.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; EDI = address of INT32 value |
; -------------------------------------------------------------------------- |
; This helper function will limit the offset stored at EDI to one quadrant. |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_Helper1: |
cmp dword [edi], 1 |
jg .set_to_one |
cmp dword [edi], -1 |
jl .set_to_neg_one |
ret |
.set_to_one: |
mcLoad1 eax |
stosd |
ret |
.set_to_neg_one: |
mcLoadNeg1 eax |
stosd |
ret |
; -------------------------------------------------------------------------- |
; SCOM |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc33: |
.pTrekData PVOID ? |
.pIWHERE PVOID ? |
.arr_BASEQX BYTES 8 |
.arr_BASEQY BYTES 8 |
.arr_BDIST DOUBLES 8 |
.nDistance INT32 ? |
.nIFINDIT INT32 ? |
.nIWHICHB INT32 ? |
.nI INT32 ? |
.nREMBASE INT32 ? |
.bSwapped BOOL ? |
.iDELTX INT32 ? |
.iDELTY INT32 ? |
.iQX INT32 ? |
.iQY INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_MoveSuperCommander: |
mcBeginLocals loc33.size |
mcLoadGameDataPtr ebx |
mcStoreLocal loc33.pTrekData, ebx |
cmp [ebx + TREKDATA.REMBASE], 0 |
jle .L60 |
; |
; Fill local arrays with base coordinates |
; |
lea esi, [ebx + TREKDATA.BASEQX] |
lea edi, [esp + loc33.arr_BASEQX] |
mcZeroBits ecx |
mov cl, 5 |
rep movsb |
lea esi, [ebx + TREKDATA.BASEQY] |
lea edi, [esp + loc33.arr_BASEQY] |
mov cl, 5 |
rep movsb |
; |
; Calculate distances to super-commander quadrant |
; |
mcLoadMember cl, TREKDATA.REMBASE |
mcStoreLocal loc33.nREMBASE, ecx |
lea esi, [esp + loc33.arr_BASEQX] |
lea edi, [esp + loc33.arr_BASEQY] |
lea edx, [esp + loc33.arr_BDIST] |
.next_base: |
mov al, [esi] |
sub al, [ebx + TREKDATA.ISX] |
movsx eax, al |
imul eax, eax |
mcStoreLocal loc33.nDistance, eax |
mov al, [edi] |
sub al, [ebx + TREKDATA.ISY] |
movsx eax, al |
imul eax, eax |
add eax, [esp + loc33.nDistance] |
call TCommon_FPU_Load_EAX |
fsqrt |
fstp tbyte [edx] |
inc esi |
inc edi |
add edx, 10 |
loop .next_base |
; |
; Now, sort all three local base arrays by distance |
; |
cmp [ebx + TREKDATA.REMBASE], 1 |
jbe .L4 |
.bubble_sort: |
mcZeroBits eax |
mcStoreLocal loc33.bSwapped, eax |
movzx ecx, [ebx + TREKDATA.REMBASE] |
dec ecx |
lea esi, [esp + loc33.arr_BASEQX] |
lea edi, [esp + loc33.arr_BASEQY] |
lea edx, [esp + loc33.arr_BDIST] |
.sort_pair: |
fld tbyte [edx + 10] |
fld tbyte [edx] |
mc_CMP_ST0_ST1 |
jc .next_pair |
jz .next_pair |
inc [esp + loc33.bSwapped] |
mov al, [esi] |
xchg al, [esi + 1] |
mov [esi], al |
mov al, [edi] |
xchg al, [edi + 1] |
mov [edi], al |
fld tbyte [edx + 10] |
fld tbyte [edx] |
fstp tbyte [edx + 10] |
fstp tbyte [edx] |
.next_pair: |
inc esi |
inc edi |
add edx, 10 |
loop .sort_pair |
cmp [esp + loc33.bSwapped], 0 |
jne .bubble_sort |
.L4: |
; |
; Look for nearest base without a COMMANDER, no Enterprise, |
; not too many klingons and not under attack. |
; |
mcZeroBits eax |
mcStoreLocal loc33.nIFINDIT, eax |
mcStoreLocal loc33.nIWHICHB, eax |
inc eax |
mcStoreLocal loc33.nI, eax |
.load_base_quad: |
mcLoadLocalRef esi, loc33.arr_BASEQX |
mcLoadLocalRef edi, loc33.arr_BASEQY |
mcLoadLocal ecx, loc33.nI |
dec ecx |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcLoadLocal ebx, loc33.pTrekData |
cmp al, [ebx + TREKDATA.QUADX] |
jne .check_battle_quad |
cmp dl, [ebx + TREKDATA.QUADY] |
je .check_next_base |
.check_battle_quad: |
cmp al, [ebx + TREKDATA.BATX] |
jne .check_klingon_count |
cmp dl, [ebx + TREKDATA.BATY] |
je .check_next_base |
.check_klingon_count: |
call TArray_GetGalaxyValue |
cmp ecx, 899 |
ja .check_next_base |
cmp [ebx + TREKDATA.REMCOM], 0 |
jle .L10 |
; |
; Check AL,DL quadrant against array of commanders |
; |
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
movzx ecx, [ebx + TREKDATA.REMCOM] |
.check_this_commander: |
cmp al, [esi] |
jne .next_commander |
cmp dl, [edi] |
je .quad_with_commander |
.next_commander: |
inc esi |
inc edi |
loop .check_this_commander |
mcLoadLocal eax, loc33.nI |
mcStoreLocal loc33.nIWHICHB, eax |
jmp .L10 |
.quad_with_commander: |
cmp [esp + loc33.nIFINDIT], 2 |
je .check_next_base |
mcLoad8bitsToReg32 eax, 2 |
mcStoreLocal loc33.nIFINDIT, eax |
mcLoadLocal eax, loc33.nI |
mcStoreLocal loc33.nIWHICHB, eax |
.check_next_base: |
inc [esp + loc33.nI] |
mcLoadLocal ecx, loc33.nI |
cmp ecx, [esp + loc33.nREMBASE] |
jbe .load_base_quad |
cmp [esp + loc33.nIFINDIT], 0 |
je .done |
.L10: |
; |
; Base found! (1-based index is stored in loc33.nIWHICHB) |
; |
mcLoadLocal ebx, loc33.pTrekData |
mcLoadLocal ecx, loc33.nIWHICHB |
dec ecx |
mcLoadLocalRef esi, loc33.arr_BASEQX |
mcLoadLocalRef edi, loc33.arr_BASEQY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
sub al, [ebx + TREKDATA.ISX] |
sub dl, [ebx + TREKDATA.ISY] |
movsx eax, al |
movsx edx, dl |
mcStoreLocal loc33.iDELTX, eax |
mcStoreLocal loc33.iDELTY, edx |
mcLoadLocalRef edi, loc33.iDELTX |
call TEvents_Helper1 |
mcLoadLocalRef edi, loc33.iDELTY |
call TEvents_Helper1 |
; |
; Attempt first to move in both directions |
; |
movzx eax, [ebx + TREKDATA.ISX] |
movzx edx, [ebx + TREKDATA.ISY] |
add eax, [esp + loc33.iDELTX] |
add edx, [esp + loc33.iDELTY] |
mcStoreLocal loc33.iQX, eax |
mcStoreLocal loc33.iQY, edx |
mov eax, .L23 |
mcStoreLocal loc33.pIWHERE, eax |
jmp .L15 |
.goto_IWHERE: |
jmp [esp + loc33.pIWHERE] |
.L15: |
; |
; Make checks on possible destination quadrant |
; |
mcLoadLocal eax, loc33.iQX |
mcLoadLocal edx, loc33.iQY |
cmp edx, 1 |
jl .goto_IWHERE |
cmp edx, 8 |
jg .goto_IWHERE |
cmp eax, 1 |
jl .goto_IWHERE |
cmp eax, 8 |
jg .goto_IWHERE |
mcLoadLocal ebx, loc33.pTrekData |
cmp al, [ebx + TREKDATA.QUADX] |
jne .check_klingons |
cmp dl, [ebx + TREKDATA.QUADY] |
je .goto_IWHERE |
.check_klingons: |
call TArray_GetGalaxyValue |
cmp ecx, 899 |
ja .goto_IWHERE |
; |
; Go ahead and move SUPER-COMMANDER! |
; |
mov al, [ebx + TREKDATA.ISX] |
mov dl, [ebx + TREKDATA.ISY] |
mov esi, ebx |
call TArray_GalaxyPtr |
sub dword [ebx], 100 |
mcLoadLocal eax, loc33.iQX |
mcLoadLocal edx, loc33.iQY |
mov [esi + TREKDATA.ISX], al |
mov [esi + TREKDATA.ISY], dl |
call TArray_GalaxyPtr |
add dword [ebx], 100 |
cmp [esi + TREKDATA.ISCATE], 0 |
je .L40 |
; |
; SUPER-COMMANDER left current quadrant |
; |
mcZeroBits eax |
mov [esi + TREKDATA.ISCATE], al |
mov [esi + TREKDATA.ISATB], al |
mov [esi + TREKDATA.ISHERE], al |
mov [esi + TREKDATA.IENTESC], al |
fld [glb_dbl_1E38] |
fstp [esi + TREKDATA.FUTURE7] |
; |
; Find S.C. index in KX,KY arrays |
; |
lea edi, [esi + TREKDATA.KX] |
lea ebx, [esi + TREKDATA.KY] |
movzx ecx, [esi + TREKDATA.NENHERE] |
mcZeroBits eax |
mcStoreLocal loc33.nI, eax |
.find_scom_in_quad: |
inc [esp + loc33.nI] |
mov al, [edi] |
mov dl, [ebx] |
push ebx |
call TArray_QuadPtr |
mov eax, ebx |
pop ebx |
cmp byte [eax], CHAR_SCOM |
je .L22 |
inc edi |
inc ebx |
loop .find_scom_in_quad |
jmp .L40 |
.L22: |
mov byte [eax], CHAR_COSMOS |
mcLoadLocal ecx, loc33.nI |
call TArray_Leave |
call TCommon_SortKlingons |
jmp .L40 |
.L23: |
; |
; Try some other maneuvers |
; |
cmp [esp + loc33.iDELTX], 0 |
je .L30 |
cmp [esp + loc33.iDELTY], 0 |
je .L30 |
; |
; Try moving just in X direction |
; |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISY] |
mcStoreLocal loc33.iQY, eax |
mov edx, .L25 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L25: |
; |
; Then try moving just in Y direction |
; |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISX] |
movzx edx, [ebx + TREKDATA.ISY] |
add edx, [esp + loc33.iDELTY] |
mcStoreLocal loc33.iQX, eax |
mcStoreLocal loc33.iQY, edx |
mov edx, .L300 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L30: |
; |
; Attempt angle move |
; |
cmp [esp + loc33.iDELTX], 0 |
jne .L35 |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISX] |
inc eax |
mcStoreLocal loc33.iQX, eax |
mov edx, .L32 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L32: |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISX] |
dec eax |
mcStoreLocal loc33.iQX, eax |
mov edx, .L300 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L35: |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISY] |
inc eax |
mcStoreLocal loc33.iQY, eax |
mov edx, .L36 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L36: |
mcLoadLocal ebx, loc33.pTrekData |
movzx eax, [ebx + TREKDATA.ISY] |
dec eax |
mcStoreLocal loc33.iQY, eax |
mov edx, .L300 |
mcStoreLocal loc33.pIWHERE, edx |
jmp .L15 |
.L40: |
; |
; SUPER-COMMANDER has moved - check/report situation |
; |
mcLoadLocal ebx, loc33.pTrekData |
movzx ecx, [ebx + TREKDATA.INPLAN] |
mcLoadMemberRef esi, TREKDATA.PLNETS |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
.check_planet: |
cmp al, [esi + TPlanet.planet_X] |
jne .next_planet |
cmp dl, [esi + TPlanet.planet_Y] |
jne .next_planet |
cmp [esi + TPlanet.planet_DILITHIUM], 1 |
jne .L45 |
jmp .scom_destroys_planet |
.next_planet: |
add esi, TPlanet.size |
loop .check_planet |
jmp .L45 |
.scom_destroys_planet: |
push eax |
mov edi, esi |
mov cl, TPlanet.size |
mcZeroBits eax |
rep stosb |
pop eax |
call TArray_NewStufPtr |
dec byte [ebx] |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jc .L45 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 212 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 213 |
call TConsole_Cram |
mcLoadLocal ebx, loc33.pTrekData |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
mov cl, 1 |
call TConsole_CramLoc |
mcLoad8bitsToReg32 ecx, 214 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 215 |
call TConsole_Prout |
.L45: |
; |
; Check for a base |
; |
mcLoadLocal ebx, loc33.pTrekData |
cmp [ebx + TREKDATA.REMBASE], 0 |
jle .L60 |
movzx ecx, [ebx + TREKDATA.REMBASE] |
mcLoadMemberRef esi, TREKDATA.BASEQX |
mcLoadMemberRef edi, TREKDATA.BASEQY |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
.verify_scom_at_base: |
cmp al, [esi] |
jne .verify_next_base |
cmp dl, [edi] |
jne .verify_next_base |
cmp al, [ebx + TREKDATA.BATX] |
jne .L80 |
cmp dl, [ebx + TREKDATA.BATY] |
jne .L80 |
.verify_next_base: |
inc esi |
inc edi |
loop .verify_scom_at_base |
; |
; Check for intelligence report |
; |
call TRandom_Ranf |
fld [glb_dbl_0dot2] |
mc_CMP_ST0_ST1 |
jc .done |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jc .done |
mcLoadLocal ebx, loc33.pTrekData |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
call TArray_GetStarChartValue |
cmp ecx, 0 |
jg .done |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 216 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 217 |
call TConsole_Cram |
mcLoadLocal ebx, loc33.pTrekData |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
mov cl, 1 |
call TConsole_CramLoc |
mcLoad8bitsToReg32 ecx, 154 |
call TConsole_Prout |
jmp .done |
.L60: |
mcLoadLocal edi, loc33.pTrekData |
fld [glb_dbl_1E38] |
fstp [edi + TREKDATA.FUTURE6] |
jmp .done |
.L80: |
; |
; Attack a base |
; |
mcLoadLocal ebx, loc33.pTrekData |
mov [ebx + TREKDATA.ISATB], 1 |
call TRandom_Ranf |
fld st |
faddp |
fld1 |
faddp |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE7] |
cmp [ebx + TREKDATA.BATX], 0 |
je .cry_sos |
; |
; FUTURE7 += FUTURE5-DATE |
; |
fld [ebx + TREKDATA.FUTURE5] |
fld [ebx + TREKDATA.DATE] |
fsubp |
fld [ebx + TREKDATA.FUTURE7] |
faddp |
fstp [ebx + TREKDATA.FUTURE7] |
.cry_sos: |
mov al, CHAR_SCOM |
call TEvents_SOS |
.L300: |
.done: |
mcEndLocals loc33.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X quadrant |
; DL = Y quadrant |
; ESI = points to TREKDATA object |
; Output: |
; CF=1 - base was removed |
; -------------------------------------------------------------------------- |
; Find the base in BASEQX,BASEQY arrays and overwrite its coordinates with |
; the last entry from these arrays. Do not decrement REMBASE! It is done |
; outside of this function. |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_RemoveThisBase: |
lea ebx, [esi + TREKDATA.BASEQX] |
lea edi, [esi + TREKDATA.BASEQY] |
movzx ecx, [esi + TREKDATA.REMBASE] |
.check_base_coords: |
cmp al, [ebx] |
jne .next_base |
cmp dl, [edi] |
je .base_found |
.next_base: |
inc ebx |
inc edi |
loop .check_base_coords |
clc |
ret |
.base_found: |
push ebx |
push edi |
lea ecx, [esi + TREKDATA.BASEQX] |
lea edx, [esi + TREKDATA.BASEQY] |
movzx eax, [esi + TREKDATA.REMBASE] |
dec eax |
mov bl, [edx + eax] |
pop esi |
mov [esi], bl |
mov bl, [ecx + eax] |
pop esi |
mov [esi], bl |
stc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = points to TREKDATA object |
; Output: |
; CF=1 if quadrant BATX,BATY contains a COMMANDER |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_VerifyBattleQuad: |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
lea ebx, [esi + TREKDATA.CX] |
lea edi, [esi + TREKDATA.CY] |
movzx ecx, [esi + TREKDATA.REMCOM] |
.check_commander: |
cmp al, [ebx] |
jne .next_commander |
cmp dl, [edi] |
je .verified |
.next_commander: |
inc ebx |
inc edi |
loop .check_commander |
clc |
ret |
.verified: |
stc |
ret |
; -------------------------------------------------------------------------- |
; SOS |
; -------------------------------------------------------------------------- |
; Input: |
; AL = which commander is attacking the base |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc34: |
.pTrekData PVOID ? |
.nESC BYTE ? |
.nIX BYTE ? |
.nIY BYTE ? |
.bRadioDamaged BYTE ? |
.dbl_DDAY DOUBLE ? |
.dbl_reserved DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_SOS: |
mcBeginLocals loc34.size |
mcStoreLocal loc34.nESC, al |
@@: |
mcLoadGameDataPtr ebx |
mcStoreLocal loc34.pTrekData, ebx |
mcZeroBits eax |
mcStoreLocal loc34.bRadioDamaged, al |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
adc [esp + loc34.bRadioDamaged], 0 |
cmp [esp + loc34.nESC], CHAR_SCOM |
je .L20 |
mov [ebx + TREKDATA.ICSOS], 0 |
cmp [esp + loc34.bRadioDamaged], 0 |
jne .done |
inc [ebx + TREKDATA.ICSOS] |
mcLoadMember al, TREKDATA.BATX |
mcLoadMember dl, TREKDATA.BATY |
mcStoreLocal loc34.nIX, al |
mcStoreLocal loc34.nIY, dl |
fld [ebx + TREKDATA.FUTURE5] |
fstp [esp + loc34.dbl_DDAY] |
jmp .L30 |
.L20: |
mov [ebx + TREKDATA.ISSOS], 0 |
cmp [esp + loc34.bRadioDamaged], 0 |
jne .done |
inc [ebx + TREKDATA.ISSOS] |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
mcStoreLocal loc34.nIX, al |
mcStoreLocal loc34.nIY, dl |
fld [ebx + TREKDATA.FUTURE7] |
fstp [esp + loc34.dbl_DDAY] |
.L30: |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 218 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal al, loc34.nIX |
mcLoadLocal dl, loc34.nIY |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 219 |
call TConsole_Cram |
mcLoadLocal al, loc34.nESC |
call TConsole_CramEnemy |
mcLoad8bitsToReg32 ecx, 220 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 221 |
call TConsole_Cram |
mov cl, 1 |
fld [esp + loc34.dbl_DDAY] |
call TConsole_CramFloat |
mcLoad8bitsToReg32 ecx, 222 |
call TConsole_Prout |
mcLoadLocal esi, loc34.pTrekData |
cmp [esi + TREKDATA.RESTING], 0 |
je .done |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 223 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 224 |
call TGame_JA |
jnc .done |
mcLoadLocal edi, loc34.pTrekData |
dec [edi + TREKDATA.RESTING] |
.done: |
mcEndLocals loc34.size |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; ECX = 1-based index of a COMMANDER or zero |
; -------------------------------------------------------------------------- |
; This function finds a quadrant where COMMANDER+BASE, but |
; no Enterprise and no SUPER COMMANDER. |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc32: |
; |
; These are not changing |
; |
.pBASEQX PBYTE ? |
.pBASEQY PBYTE ? |
; |
; These are incrementing at the end of outer loop |
; |
.pCX PBYTE ? |
.pCY PBYTE ? |
.nCommanderIndex INDEX ? |
; |
; Loop limits |
; |
.nCommanders COUNT ? |
.nBases COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_FindCmdrAtBase: |
mcBeginLocals loc32.size |
mcLoadGameDataPtr ebx |
movzx ecx, [ebx + TREKDATA.REMBASE] |
movzx edx, [ebx + TREKDATA.REMCOM] |
mcStoreLocal loc32.nBases, ecx |
mcStoreLocal loc32.nCommanders, edx |
mcLoad1 eax |
mcStoreLocal loc32.nCommanderIndex, eax |
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
mcStoreLocal loc32.pCX, esi |
mcStoreLocal loc32.pCY, edi |
mcLoadMemberRef esi, TREKDATA.BASEQX |
mcLoadMemberRef edi, TREKDATA.BASEQY |
mcStoreLocal loc32.pBASEQX, esi |
mcStoreLocal loc32.pBASEQY, edi |
.load_commander_quad: |
mcLoadLocal esi, loc32.pCX |
mcLoadLocal edi, loc32.pCY |
mov al, [esi] |
mov dl, [edi] |
cmp al, [ebx + TREKDATA.ISX] |
jne .check_against_ship |
cmp dl, [ebx + TREKDATA.ISY] |
je .next_commander |
.check_against_ship: |
cmp al, [ebx + TREKDATA.QUADX] |
jne .check_against_all_bases |
cmp dl, [ebx + TREKDATA.QUADY] |
je .next_commander |
.check_against_all_bases: |
mcLoadLocal esi, loc32.pBASEQX |
mcLoadLocal edi, loc32.pBASEQY |
mcLoadLocal ecx, loc32.nBases |
.check_against_base: |
cmp al, [esi] |
jne .next_base |
cmp dl, [edi] |
je .commander_located |
.next_base: |
inc esi |
inc edi |
loop .check_against_base |
.next_commander: |
inc [esp + loc32.nCommanderIndex] |
mcLoadLocal ecx, loc32.nCommanderIndex |
cmp ecx, [esp + loc32.nCommanders] |
ja .ret_zero |
inc [esp + loc32.pCX] |
inc [esp + loc32.pCY] |
jmp .load_commander_quad |
.commander_located: |
mcLoadLocal ecx, loc32.nCommanderIndex |
jmp .done |
.ret_zero: |
mcZeroBits ecx |
.done: |
mcEndLocals loc32.size |
ret |
; -------------------------------------------------------------------------- |
; EVENTS |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc31: |
.pTrekData PVOID ? |
.bICTBEAM BOOL ? |
.bISTRACT BOOL ? |
.nLINE INDEX ? |
.nL INDEX ? |
.nI INDEX ? |
.nYANK INT32 ? |
.dbl_DATEMIN DOUBLE ? |
.dbl_XTIME DOUBLE ? |
.dbl_REPAIR DOUBLE ? |
.dbl_Reserved DOUBLE ? |
.iXHOLD BYTE ? |
.iYHOLD BYTE ? |
.nDamage_3_and_4 BYTE ? |
.byte_Reserved BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_Main: |
mcBeginLocals loc31.size |
mcLoadGameDataPtr edx |
mcStoreLocal loc31.pTrekData, edx |
mcZeroBits eax |
mcStoreLocal loc31.bICTBEAM, eax |
mcStoreLocal loc31.bISTRACT, eax |
.L10: |
mcZeroBits eax |
mcStoreLocal loc31.nLINE, eax |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
; |
; Pick earliest event |
; |
fld [esi + TREKDATA.DATE] |
fld [esi + TREKDATA.TIME] |
faddp |
fstp [esp + loc31.dbl_DATEMIN] |
mcLoad8bitsToReg32 ecx, 7 |
lea edi, [esi + TREKDATA.FUTURE1] |
mcLoad1 eax |
mcStoreLocal loc31.nL, eax |
.check_event: |
fld tbyte [edi] |
fld [esp + loc31.dbl_DATEMIN] |
mc_CMP_ST0_ST1 |
jc .L20 |
mcLoadLocal eax, loc31.nL |
mcStoreLocal loc31.nLINE, eax |
fld tbyte [edi] |
fstp [esp + loc31.dbl_DATEMIN] |
.L20: |
add edi, 10 |
inc [esp + loc31.nL] |
loop .check_event |
fld [esp + loc31.dbl_DATEMIN] |
fld [esi + TREKDATA.DATE] |
fsubp |
fstp [esp + loc31.dbl_XTIME] |
fld [esp + loc31.dbl_DATEMIN] |
fstp [esi + TREKDATA.DATE] |
; |
; Deplete Federation Resources |
; |
movzx eax, [esi + TREKDATA.REMCOM] |
movzx edx, [esi + TREKDATA.REMKL] |
shl eax, 2 |
add eax, edx |
call TCommon_FPU_Load_EAX |
fld [esp + loc31.dbl_XTIME] |
fmulp |
fld [esi + TREKDATA.REMRES] |
fsubrp |
fld st |
fstp [esi + TREKDATA.REMRES] |
fild [glb_FPU_Int32] |
fdivp |
fld st |
fstp [esi + TREKDATA.REMTIME] |
fldz |
mc_CMP_ST0_ST1 |
jc .L30 |
mov al, 2 |
.finished: |
call TFinish_Main |
jmp .done |
.L30: |
; |
; Verify Life Support is OK |
; |
mov cl, DEV_LIFE_SUPPORT |
call TArray_IsDamaged |
jnc .L50 |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L50 |
fld [esi + TREKDATA.LSUPRES] |
fld [esp + loc31.dbl_XTIME] |
mc_CMP_ST0_ST1 |
jc .L40 |
jz .L40 |
fld [esi + TREKDATA.LSUPRES] |
mov cl, DEV_LIFE_SUPPORT |
call TArray_GetDblDamage |
mc_CMP_ST0_ST1 |
jc .L40 |
jz .L40 |
mov al, 3 |
jmp .finished |
.L40: |
mcLoadLocal esi, loc31.pTrekData |
fld [esi + TREKDATA.LSUPRES] |
fld [esp + loc31.dbl_XTIME] |
fsubp |
fstp [esi + TREKDATA.LSUPRES] |
mov cl, DEV_LIFE_SUPPORT |
call TArray_GetDblDamage |
fld [esp + loc31.dbl_XTIME] |
mc_CMP_ST0_ST1 |
jc .L50 |
mcLoadLocal esi, loc31.pTrekData |
fld [esi + TREKDATA.INLSR] |
fstp [esi + TREKDATA.LSUPRES] |
.L50: |
; |
; Fix devices... |
; |
fld [esp + loc31.dbl_XTIME] |
fstp [esp + loc31.dbl_REPAIR] |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .fix_devices |
fld [esp + loc31.dbl_XTIME] |
fld [glb_dbl_DOCKFAC] |
fdivp |
fstp [esp + loc31.dbl_REPAIR] |
.fix_devices: |
lea ebx, [esi + TREKDATA.DAMAGE] |
mcLoad8bitsToReg32 ecx, 13 |
.fix_it: |
fldz |
fld tbyte [ebx] |
mc_CMP_ST0_ST1 |
jz .L60 |
fld tbyte [ebx] |
fld [esp + loc31.dbl_REPAIR] |
fsubp |
fstp tbyte [ebx] |
fldz |
fld tbyte [ebx] |
mc_CMP_ST0_ST1 |
jnc .L60 |
fldz |
fstp tbyte [ebx] |
.L60: |
add ebx, 10 |
loop .fix_it |
; |
; Jump to event IF (LINE != 0) |
; |
fld [esi + TREKDATA.TIME] |
fld [esp + loc31.dbl_XTIME] |
fsubp |
fstp [esi + TREKDATA.TIME] |
cmp [esp + loc31.nLINE], 0 |
je .L5000 |
mcLoadLocal eax, loc31.nLINE |
mcOnRegEqu eax, 1, .L100 |
mcOnRegEqu eax, 2, .L200 |
mcOnRegEqu eax, 3, .L300 |
mcOnRegEqu eax, 4, .L400 |
mcOnRegEqu eax, 5, .L500 |
mcOnRegEqu eax, 6, .L600 |
mcOnRegEqu eax, 7, .L700 |
;int 3 |
jmp .done ; Something is broken in the code! |
.L100: |
; |
; Supernova! |
; |
mcZeroBits eax |
mcZeroBits edx |
call TNova_SuperNova |
mcLoadLocal ebx, loc31.pTrekData |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE1] |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
je .done |
jmp .L10 |
.L200: |
; |
; Tractor Beam! |
; |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
je .L220 |
cmp [esp + loc31.bISTRACT], 0 |
jne .L210 |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L210 |
; |
; Select a Commander who will beam |
; |
movzx edx, [esi + TREKDATA.REMCOM] |
call TRandom_IRan |
mcStoreLocal loc31.nI, eax |
mcLoadLocal esi, loc31.pTrekData |
movzx ecx, [esi + TREKDATA.QUADX] |
movzx edx, [esi + TREKDATA.QUADY] |
movzx ebx, [esi + eax + TREKDATA.CX] |
sub ebx, ecx |
imul ebx, ebx |
mcStoreLocal loc31.nYANK, ebx |
movzx ebx, [esi + eax + TREKDATA.CY] |
sub ebx, edx |
imul ebx, ebx |
add [esp + loc31.nYANK], ebx |
movzx eax, [esi + TREKDATA.JUSTIN] |
add eax, [esp + loc31.nYANK] |
mcOnRegZero eax, .L210 |
cmp [esp + loc31.bISTRACT], 0 |
je .L201 |
.L20010: |
mcLoadLocal esi, loc31.pTrekData |
movzx ecx, [esi + TREKDATA.QUADX] |
movzx edx, [esi + TREKDATA.QUADY] |
movzx ebx, [esi + TREKDATA.ISX] |
sub ebx, ecx |
imul ebx, ebx |
mcStoreLocal loc31.nYANK, ebx |
movzx ebx, [esi + TREKDATA.ISY] |
sub ebx, edx |
imul ebx, ebx |
add [esp + loc31.nYANK], ebx |
.L201: |
mcLoadLocal eax, loc31.nYANK |
call TCommon_FPU_Load_EAX |
fsqrt |
fld [glb_dbl_0dot1777777777] |
fmulp |
mcLoadLocal edi, loc31.pTrekData |
fstp [edi + TREKDATA.TIME] |
inc [esp + loc31.bICTBEAM] |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
mcLoad8bitsToReg32 ecx, 191 |
call TConsole_Prout |
mov al, 14 |
mov cl, 1 |
call TNova_AutomaticOverride |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
cmp [esi + TREKDATA.ICRAFT], 1 |
jne .L203 |
mov al, 18 |
jmp .finished |
.L203: |
cmp [esi + TREKDATA.ISCRAFT], 0 |
jne .L204 |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 192 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mov cl, DEV_SHUTTLE_CRAFT |
fld [glb_dbl_Ten] |
fchs |
call TArray_SetDblDamage |
mcLoadLocal edi, loc31.pTrekData |
mov [edi + TREKDATA.ISCRAFT], -1 |
.L204: |
cmp [esp + loc31.bISTRACT], 0 |
je .L205 |
mcLoadLocal ebx, loc31.pTrekData |
mcLoadMember al, TREKDATA.ISX |
mcLoadMember dl, TREKDATA.ISY |
mcStoreMember TREKDATA.QUADX, al |
mcStoreMember TREKDATA.QUADY, dl |
jmp .L206 |
.L205: |
mcLoadLocal ebx, loc31.pTrekData |
mcLoadLocal ecx, loc31.nI |
mov al, [ebx + ecx + TREKDATA.CX] |
mov dl, [ebx + ecx + TREKDATA.CY] |
mcStoreMember TREKDATA.QUADX, al |
mcStoreMember TREKDATA.QUADY, dl |
.L206: |
call TRandom_IRan10 |
mcLoadLocal ebx, loc31.pTrekData |
mcStoreMember TREKDATA.SECTX, al |
mcStoreMember TREKDATA.SECTY, dl |
mcLoad8bitsToReg32 ecx, 194 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal ebx, loc31.pTrekData |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
call TConsole_CramLoc |
mcLoad8bitsToReg32 ecx, 53 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal ebx, loc31.pTrekData |
mcLoadMember al, TREKDATA.SECTX |
mcLoadMember dl, TREKDATA.SECTY |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.RESTING], 0 |
je .check_shields |
dec [esi + TREKDATA.RESTING] |
mcLoad8bitsToReg32 ecx, 195 |
call TConsole_ProutGameMsg |
.check_shields: |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne .L208 |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jc .no_shields |
mcLoadLocal esi, loc31.pTrekData |
fld [esi + TREKDATA.SHLD] |
fldz |
mc_CMP_ST0_ST1 |
jc .L207 |
.no_shields: |
mcLoad8bitsToReg32 ecx, 196 |
call TConsole_ProutGameMsg |
jmp .L208 |
.L207: |
call TShields_Up |
mcLoadLocal ebx, loc31.pTrekData |
mcZeroBits eax |
mcStoreMember TREKDATA.SHLDCHG, al |
.L208: |
call TCommon_NewQuad |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
jle .L220 |
.L210: |
mcLoadLocal ebx, loc31.pTrekData |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_1dot5] |
fmulp |
movzx eax, [ebx + TREKDATA.REMCOM] |
call TCommon_FPU_Load_EAX |
fdivp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fld [ebx + TREKDATA.TIME] |
faddp |
fstp [ebx + TREKDATA.FUTURE2] |
jmp .L10 |
.L220: |
fld [glb_dbl_1E38] |
mcLoadLocal edi, loc31.pTrekData |
fstp [edi + TREKDATA.FUTURE2] |
jmp .L10 |
.L300: |
; |
; Snapshot of Universe (for Time Warp)! |
; |
mov esi, [glb_pCommon] |
inc [esi + TCommon.SNAP] |
lea edi, [esi + TCommon.SNAPSHT] |
add esi, TCommon.GAMEDB |
mov ecx, TREKDATA.size |
rep movsb |
mcLoadLocal ebx, loc31.pTrekData |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE3] |
jmp .L10 |
.L400: |
; |
; Commander attacks starbase! |
; |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
je .disable_com_at_base |
cmp [esi + TREKDATA.REMBASE], 0 |
jne .L410 |
.disable_com_at_base: |
fld [glb_dbl_1E38] |
fld st |
mcLoadLocal edi, loc31.pTrekData |
fstp [edi + TREKDATA.FUTURE4] |
fstp [edi + TREKDATA.FUTURE5] |
jmp .L10 |
.L410: |
; |
; Find a quadrant where COMMANDER+BASE, but |
; no Enterprise and no SUPER COMMANDER. |
; |
call TEvents_FindCmdrAtBase |
mcOnRegNotZero ecx, .L430 |
mcLoadLocal ebx, loc31.pTrekData |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot3] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE4] |
fld [glb_dbl_1E38] |
fstp [ebx + TREKDATA.FUTURE5] |
jmp .L10 |
.L430: |
mcLoadGameDataPtr esi |
dec ecx |
mov al, [esi + ecx + TREKDATA.CX] |
mov dl, [esi + ecx + TREKDATA.CY] |
mov [esi + TREKDATA.BATX], al |
mov [esi + TREKDATA.BATY], dl |
call TRandom_Ranf |
fld [glb_dbl_3] |
fmulp |
fld1 |
faddp |
fld [esi + TREKDATA.DATE] |
faddp |
fstp [esi + TREKDATA.FUTURE5] |
cmp [esi + TREKDATA.ISATB], 0 |
je .L431 |
; |
; FUTURE(5) += FUTURE(7)-DATE |
; |
fld [esi + TREKDATA.FUTURE7] |
fld [esi + TREKDATA.DATE] |
fsubp |
fld [esi + TREKDATA.FUTURE5] |
faddp |
fstp [esi + TREKDATA.FUTURE5] |
.L431: |
fld [esi + TREKDATA.INTIME] |
fld [glb_dbl_0dot3] |
fmulp |
call TCommon_ExpRan |
fld [esi + TREKDATA.FUTURE5] |
faddp |
fstp [esi + TREKDATA.FUTURE4] |
mov al, CHAR_COMMANDER |
call TEvents_SOS |
jmp .L10 |
.L500: |
; |
; Commander destroys a starbase! |
; |
mcLoadLocal edi, loc31.pTrekData |
fld [glb_dbl_1E38] |
fstp [edi + TREKDATA.FUTURE5] |
.L502: |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.ISATB], 2 |
jne .L505 |
mov al, [esi + TREKDATA.ISX] |
mov dl, [esi + TREKDATA.ISY] |
call TArray_GetGalaxyValue |
mov eax, ecx |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 100 |
div ecx |
cmp edx, 10 |
jb .done |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
mcStoreLocal loc31.iXHOLD, al |
mcStoreLocal loc31.iYHOLD, dl |
mov al, [esi + TREKDATA.ISX] |
mov dl, [esi + TREKDATA.ISY] |
mov [esi + TREKDATA.BATX], al |
mov [esi + TREKDATA.BATY], dl |
jmp .L520 |
.L505: |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
je .L515 |
cmp [esi + TREKDATA.REMBASE], 0 |
je .L515 |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
call TArray_GetGalaxyValue |
mov eax, ecx |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 100 |
div ecx |
cmp edx, 10 |
jb .L515 |
call TEvents_VerifyBattleQuad |
jc .L520 |
.L515: |
mcLoadLocal edi, loc31.pTrekData |
mcZeroBits eax |
mov [edi + TREKDATA.BATX], al |
mov [edi + TREKDATA.BATY], al |
jmp .L10 |
.L520: |
mcLoadLocal esi, loc31.pTrekData |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
call TArray_StarChartPtr |
cmp dword [ebx], -1 |
jne .L5201 |
mcZeroBits eax |
mov [ebx], eax |
.L5201: |
cmp dword [ebx], 1000 |
jb .L5202 |
sub dword [ebx], 10 |
.L5202: |
mcLoadLocal esi, loc31.pTrekData |
mov al, [esi + TREKDATA.BATX] |
cmp al, [esi + TREKDATA.QUADX] |
jne .L545 |
mov dl, [esi + TREKDATA.BATY] |
cmp dl, [esi + TREKDATA.QUADY] |
jne .L545 |
; |
; Base is destroyed with ship present! |
; |
mov al, [esi + TREKDATA.BASEX] |
mov dl, [esi + TREKDATA.BASEY] |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
mcZeroBits eax |
mov [esi + TREKDATA.BASEX], al |
mov [esi + TREKDATA.BASEY], al |
call TCommon_NewCondition |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 197 |
call TConsole_Prout |
jmp .L550 |
.L545: |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jc .L550 |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.REMBASE], 1 |
je .L550 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 198 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 199 |
call TConsole_Cram |
mcLoadLocal esi, loc31.pTrekData |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
mov cl, 1 |
call TConsole_CramLoc |
mcLoad8bitsToReg32 ecx, 200 |
call TConsole_Prout |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.ISATB], 2 |
jne .L547 |
mcLoad8bitsToReg32 ecx, 201 |
call TConsole_Prout |
jmp .L550 |
.L547: |
mcLoad8bitsToReg32 ecx, 202 |
call TConsole_Prout |
.L550: |
; |
; Remove starbase from Galaxy |
; |
mcLoadLocal esi, loc31.pTrekData |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
call TArray_GalaxyPtr |
sub dword [ebx], 10 |
cmp [esi + TREKDATA.REMBASE], 1 |
jle .L580 |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
call TEvents_RemoveThisBase |
.L580: |
mcLoadLocal esi, loc31.pTrekData |
dec [esi + TREKDATA.REMBASE] |
cmp [esi + TREKDATA.ISATB], 2 |
jne .L515 |
; |
; Reinstate a COMMANDER's base attack |
; |
mcLoadLocal al, loc31.iXHOLD |
mcLoadLocal dl, loc31.iYHOLD |
mov [esi + TREKDATA.BATX], al |
mov [esi + TREKDATA.BATY], dl |
mov [esi + TREKDATA.ISATB], 0 |
jmp .L10 |
.L600: |
; |
; Super-Commander moves! |
; |
mcLoadLocal esi, loc31.pTrekData |
fld [esi + TREKDATA.DATE] |
fld [glb_dbl_0dot2777] |
faddp |
fstp [esi + TREKDATA.FUTURE6] |
movzx eax, [esi + TREKDATA.IENTESC] |
add eax, [esp + loc31.bISTRACT] |
mcOnRegNotZero eax, .L10 |
cmp [esi + TREKDATA.ISATB], 1 |
je .L10 |
cmp [esi + TREKDATA.ISCATE], 1 |
jne .move_scom |
cmp [esi + TREKDATA.JUSTIN], 1 |
jne .L10 |
.move_scom: |
call TEvents_MoveSuperCommander |
jmp .L10 |
.L700: |
; |
; Super-Commander destroys base! |
; |
mcLoadLocal edi, loc31.pTrekData |
fld [glb_dbl_1E38] |
fstp [edi + TREKDATA.FUTURE7] |
mov [edi + TREKDATA.ISATB], 2 |
jmp .L502 |
.L5000: |
; |
; Check with spy to see if SUPER COMMANDER |
; will tractor beam the ship |
; |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.NSCREM], 0 |
je .done |
mcLoadLocal eax, loc31.bICTBEAM |
add eax, [esp + loc31.bISTRACT] |
mcOnRegNotZero eax, .done |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .done |
cmp [esi + TREKDATA.ISATB], 1 |
je .done |
cmp [esi + TREKDATA.ISCATE], 1 |
je .done |
cmp [esi + TREKDATA.IENTESC], 0 |
jne .L5100 |
fld [glb_dbl_2500] |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jnc .L5001 |
cmp [esi + TREKDATA.TORPS], 4 |
jae .L5001 |
fld [glb_dbl_1250] |
fld [esi + TREKDATA.SHLD] |
mc_CMP_ST0_ST1 |
jc .L5100 |
.L5001: |
mcZeroBits eax |
mcStoreLocal loc31.nDamage_3_and_4, al |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
adc [esp + loc31.nDamage_3_and_4], 0 |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
adc [esp + loc31.nDamage_3_and_4], 0 |
cmp [esp + loc31.nDamage_3_and_4], 2 |
jne .L5002 |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.TORPS], 4 |
jb .L5100 |
.L5002: |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jnc .done |
mcLoadLocal esi, loc31.pTrekData |
fld [glb_dbl_3000] |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L5003 |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
jnc .done |
.L5003: |
mcLoadLocal esi, loc31.pTrekData |
cmp [esi + TREKDATA.TORPS], 5 |
jb .L5100 |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
jnc .done |
.L5100: |
call TRandom_Ranf |
fld [glb_dbl_0dot65] |
mc_CMP_ST0_ST1 |
jc .done |
inc [esp + loc31.bISTRACT] |
jmp .L20010 |
.done: |
mcEndLocals loc31.size |
ret |
; -------------------------------------------------------------------------- |
; MOVETHO |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc90: |
.pTrekData PVOID ? |
.nIDX BYTE ? |
.nIDY BYTE ? |
.nDeltaX BYTE ? |
.nDeltaY BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TEvents_MoveTholian: |
mcBeginLocals loc90.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc90.pTrekData, esi |
cmp [esi + TREKDATA.ITHERE], 0 |
je .done |
cmp [esi + TREKDATA.JUSTIN], 1 |
je .done |
mcZeroBits eax |
mcStoreLocal loc90.nDeltaX, al |
mcStoreLocal loc90.nDeltaY, al |
mov al, [esi + TREKDATA.ITHX] |
mov dl, [esi + TREKDATA.ITHY] |
mcOnRegEqu al, 1, .ITHX_is_1 |
mcOnRegEqu al, 10, .ITHX_is_10 |
jmp .get_rid_of_tholian |
.ITHX_is_1: |
mcOnRegEqu dl, 1, .L10 |
mcOnRegEqu dl, 10, .L20 |
jmp .get_rid_of_tholian |
.ITHX_is_10: |
mcOnRegEqu dl, 10, .L30 |
mcOnRegEqu dl, 1, .L40 |
.get_rid_of_tholian: |
mov [esi + TREKDATA.ITHERE], 0 |
;int 3 |
jmp .done |
; |
; Set destination sector |
; |
.L10: |
mov [esp + loc90.nIDX], 1 |
mov [esp + loc90.nIDY], 10 |
inc [esp + loc90.nDeltaY] |
jmp .L50 |
.L20: |
mov [esp + loc90.nIDX], 10 |
mov [esp + loc90.nIDY], 10 |
inc [esp + loc90.nDeltaX] |
jmp .L50 |
.L30: |
mov [esp + loc90.nIDX], 10 |
mov [esp + loc90.nIDY], 1 |
dec [esp + loc90.nDeltaY] |
jmp .L50 |
.L40: |
mov [esp + loc90.nIDX], 1 |
mov [esp + loc90.nIDY], 1 |
dec [esp + loc90.nDeltaX] |
.L50: |
; |
; Make sure destination is empty or web occupies it |
; |
mcLoadLocal al, loc90.nIDX |
mcLoadLocal dl, loc90.nIDY |
call TArray_QuadPtr |
mov al, [ebx] |
mcOnRegEqu al, CHAR_COSMOS, .move |
mcOnRegNotEqu al, CHAR_WEB, .done |
.move: |
; |
; Leave a web where Tholian is now |
; |
mcLoadLocal esi, loc90.pTrekData |
mov al, [esi + TREKDATA.ITHX] |
mov dl, [esi + TREKDATA.ITHY] |
call TArray_QuadPtr |
mov cl, [ebx] |
mcOnRegEqu cl, CHAR_COSMOS, .put_web |
mcOnRegNotEqu cl, CHAR_THOLIAN, .add_deltas |
.put_web: |
mov byte [ebx], CHAR_WEB |
.add_deltas: |
mcLoadLocal al, loc90.nDeltaX |
mcLoadLocal dl, loc90.nDeltaY |
mcLoadLocal esi, loc90.pTrekData |
add [esi + TREKDATA.ITHX], al |
add [esi + TREKDATA.ITHY], dl |
; |
; Check if Tholian arrived into destination sector |
; |
mov al, [esi + TREKDATA.ITHX] |
mov dl, [esi + TREKDATA.ITHY] |
cmp al, [esp + loc90.nIDX] |
jne .move |
cmp dl, [esp + loc90.nIDY] |
jne .move |
; |
; Check if web around quadrant is complete |
; |
call TArray_IsWebComplete |
jc .tholian_leaves |
mcLoadLocal al, loc90.nIDX |
mcLoadLocal dl, loc90.nIDY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_THOLIAN |
jmp .done |
.tholian_leaves: |
mcLoadLocal esi, loc90.pTrekData |
mcZeroBits eax |
mov [esi + TREKDATA.ITHERE], al |
mov [esi + TREKDATA.ITHX], al |
mov [esi + TREKDATA.ITHY], al |
mov ecx, 664 |
call TConsole_ProutGameMsg |
mov al, CHAR_BLACK_HOLE |
call TCommon_DropIn |
.done: |
mcEndLocals loc90.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TFinish.Asm |
---|
0,0 → 1,551 |
; -------------------------------------------------------------------------- |
; FILE: TFinish.Asm |
; DATE: October 13, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; FINISH |
; -------------------------------------------------------------------------- |
; Input: |
; AL = game ending code |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc47: |
.pTrekData PVOID ? |
.bIGotIt BOOL ? |
.nEndCode INT32 ? |
.dbl_DateDiff DOUBLE ? |
.dbl_RateMax DOUBLE ? |
.dbl_PerDate DOUBLE ? |
.dbl_Goodies DOUBLE ? |
.dbl_Baddies DOUBLE ? |
.dbl_Advantage DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TFinish_Main: |
mcBeginLocals loc47.size |
movzx eax, al |
mcStoreLocal loc47.nEndCode, eax |
invoke Sleep, 1000 |
mcLoadGameDataPtr edi |
mcStoreLocal loc47.pTrekData, edi |
inc [edi + TREKDATA.ALLDONE] |
mcZeroBits eax |
mcStoreLocal loc47.bIGotIt, eax |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
mov cl, ATTR_SHIP |
call TConsole_SetAttr |
mov ecx, 477 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal esi, loc47.pTrekData |
fld [esi + TREKDATA.DATE] |
call TConsole_CramFloat |
mov ecx, 478 |
call TConsole_Prout |
call TConsole_ScrollUp |
mcLoadLocal eax, loc47.nEndCode |
mcOnRegEqu eax, 1, .L100 |
mcOnRegEqu eax, 2, .L200 |
mcOnRegEqu eax, 3, .L300 |
mcOnRegEqu eax, 4, .L400 |
mcOnRegEqu eax, 5, .L500 |
mcOnRegEqu eax, 6, .L600 |
mcOnRegEqu eax, 7, .L700 |
mcOnRegEqu eax, 8, .L800 |
mcOnRegEqu eax, 9, .L900 |
mcOnRegEqu eax, 10, .L1000 |
mcOnRegEqu eax, 11, .L1100 |
mcOnRegEqu eax, 12, .L5000 |
mcOnRegEqu eax, 13, .L1300 |
mcOnRegEqu eax, 14, .L1400 |
mcOnRegEqu eax, 15, .L1500 |
mcOnRegEqu eax, 16, .L1600 |
mcOnRegEqu eax, 17, .L1700 |
mcOnRegEqu eax, 18, .L1800 |
mcOnRegEqu eax, 21, .L2100 |
mcOnRegEqu eax, 22, .L2200 |
;int 3 |
jmp .done |
.L100: |
mcLoadLocal esi, loc47.pTrekData |
cmp [esi + TREKDATA.NROMREM], 0 |
je .L105 |
movzx eax, [esi + TREKDATA.NROMREM] |
push eax |
mov ecx, 479 |
call TConsole_Cram |
pop eax |
call TConsole_CramInt |
mov ecx, 480 |
call TConsole_Prout |
call TConsole_ScrollUp |
.L105: |
mov ecx, 481 |
call TConsole_Prout |
mov ecx, 482 |
call TConsole_Prout |
mcLoadLocal esi, loc47.pTrekData |
mov [esi + TREKDATA.GAMEWON], 1 |
cmp [esi + TREKDATA.ALIVE], 0 |
je .L130 |
cmp [esi + TREKDATA.BASEKL], 0 |
jne .L130 |
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE |
jne .L130 |
movzx eax, [esi + TREKDATA.STARKL] |
imul eax, 5 |
movzx ecx, [esi + TREKDATA.CASUAL] |
add eax, ecx |
movzx ecx, [esi + TREKDATA.NPLANKL] |
imul ecx, 10 |
add eax, ecx |
movzx ecx, [esi + TREKDATA.NHELP] |
imul ecx, 45 |
add eax, ecx |
cmp eax, 100 |
jae .L130 |
fld [glb_dbl_5] |
fld [esi + TREKDATA.DATE] |
fld [esi + TREKDATA.INDATE] |
fsubp |
fld st |
fstp [esp + loc47.dbl_DateDiff] |
mc_CMP_ST0_ST1 |
jc .L110 |
mov al, [esi + TREKDATA.SKILL] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_0dot1] |
fmulp |
inc al |
call TCommon_LoadByteIntoFPU |
fmulp |
fld [glb_dbl_0dot1] |
faddp |
fstp [esp + loc47.dbl_RateMax] |
mov al, [esi + TREKDATA.KILLK] |
add al, [esi + TREKDATA.KILLC] |
add al, [esi + TREKDATA.NSCKILL] |
fld [esp + loc47.dbl_DateDiff] |
fdivp |
fstp [esp + loc47.dbl_PerDate] |
fld [esp + loc47.dbl_RateMax] |
fld [esp + loc47.dbl_PerDate] |
mc_CMP_ST0_ST1 |
jc .L130 |
.L110: |
call TConsole_ScrollUp |
mov ecx, 483 |
call TConsole_Prout |
mcLoadLocal esi, loc47.pTrekData |
cmp [esi + TREKDATA.SKILL], 4 |
je .L120 |
cmp [esi + TREKDATA.SKILL], 5 |
je .L125 |
mov ecx, 484 |
call TConsole_Cram |
mov ecx, 484 |
mcLoadLocal esi, loc47.pTrekData |
movzx eax, [esi + TREKDATA.SKILL] |
add ecx, eax |
call TConsole_Prout |
mov ecx, 488 |
call TConsole_Prout |
jmp .L130 |
.L120: |
mov ecx, 489 |
call TConsole_Prout |
inc [esp + loc47.bIGotIt] |
call TConsole_ScrollUp |
mov ecx, 490 |
call TConsole_Prout |
mov ecx, 491 |
call TConsole_Prout |
mov ecx, 492 |
call TConsole_Prout |
jmp .L130 |
.L125: |
call TConsole_ScrollUp |
mov ecx, 493 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 494 |
call TConsole_Prout |
mov ecx, 495 |
call TConsole_Prout |
mov ecx, 495 |
call TConsole_Prout |
mov ecx, 495 |
call TConsole_Prout |
mov ecx, 496 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 497 |
call TConsole_Prout |
inc [esp + loc47.bIGotIt] |
.L130: |
call TConsole_ScrollUp |
mov ecx, 498 |
call TConsole_Prout |
call TGame_Score |
cmp [esp + loc47.bIGotIt], 0 |
je .done |
call TApp_PlaqueProcessor |
jmp .done |
.L200: |
mov ecx, 499 |
call TConsole_Prout |
mov ecx, 500 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 501 |
call TConsole_Prout |
mov ecx, 502 |
call TConsole_Prout |
mcLoadLocal esi, loc47.pTrekData |
movzx eax, [esi + TREKDATA.REMKL] |
movzx edx, [esi + TREKDATA.INKLING] |
imul eax, 3 |
cmp eax, edx |
ja .L210 |
mov ecx, 503 |
call TConsole_Prout |
mcLoadLocal esi, loc47.pTrekData |
mov [esi + TREKDATA.ALIVE], 0 |
.score_and_return: |
call TGame_Score |
jmp .done |
.L210: |
mov ecx, 504 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 498 |
call TConsole_Prout |
jmp .score_and_return |
.L300: |
mov ecx, 505 |
call TConsole_Prout |
mov ecx, 506 |
call TConsole_Prout |
.L310: |
call TConsole_ScrollUp |
mov ecx, 507 |
call TConsole_Prout |
jmp .L5000 |
.L400: |
mov ecx, 508 |
call TConsole_Prout |
jmp .L310 |
.L500: |
mov ecx, 509 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 510 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 511 |
call TConsole_Prout |
jmp .L5000 |
.L600: |
mov ecx, 512 |
call TConsole_Prout |
mov ecx, 513 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 514 |
call TConsole_Prout |
jmp .score_and_return |
.L700: |
mov ecx, 515 |
call TConsole_Prout |
.L705: |
mov ecx, 516 |
call TConsole_Prout |
jmp .L5000 |
.L800: |
mov ecx, 509 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 517 |
call TConsole_Prout |
mov ecx, 518 |
call TConsole_Prout |
jmp .L5000 |
.L900: |
mov ecx, 519 |
call TConsole_Prout |
mov ecx, 520 |
call TConsole_Prout |
mov ecx, 521 |
call TConsole_Prout |
mov ecx, 522 |
call TConsole_Prout |
jmp .L5000 |
.L1000: |
mov ecx, 523 |
call TConsole_Prout |
jmp .L5000 |
.L1100: |
mov ecx, 524 |
call TConsole_Prout |
mov ecx, 525 |
call TConsole_Prout |
jmp .L5000 |
.L1300: |
mov ecx, 526 |
call TConsole_Prout |
mov ecx, 527 |
call TConsole_Prout |
jmp .L1410 |
.L1400: |
mcLoadLocal esi, loc47.pTrekData |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
mov al, [edi + TPlanet.planet_CLASS] |
mcOnRegNotEqu al, 1, .L1401 |
mov ecx, 528 |
call TConsole_Prout |
mov ecx, 529 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 530 |
call TConsole_Prout |
jmp .L1410 |
.L1401: |
push eax |
mov ecx, 531 |
call TConsole_Prout |
mov ecx, 532 |
call TConsole_Cram |
pop eax |
add al, 'L' |
call TConsole_PutChar |
mov ecx, 533 |
call TConsole_Prout |
mov ecx, 534 |
call TConsole_Prout |
mov ecx, 535 |
call TConsole_Prout |
.L1410: |
call TConsole_ScrollUp |
mov ecx, 536 |
call TConsole_Prout |
call TConsole_CramShip |
mov ecx, 537 |
call TConsole_Prout |
jmp .L5000 |
.L1500: |
mov ecx, 538 |
call TConsole_Prout |
jmp .L705 |
.L1600: |
mov ecx, 539 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 540 |
call TConsole_Cram |
call TConsole_CramShip |
call TConsole_ScrollUp |
mov ecx, 541 |
call TConsole_Prout |
jmp .L5000 |
.L1700: |
mov ecx, 542 |
call TConsole_Prout |
jmp .L1600 |
.L1800: |
mov ecx, 543 |
call TConsole_Prout |
mov ecx, 544 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 545 |
call TConsole_Prout |
jmp .L1410 |
.L2100: |
mov ecx, 546 |
call TConsole_Prout |
mov ecx, 547 |
call TConsole_Prout |
jmp .L5000 |
.L2200: |
mov ecx, 548 |
call TConsole_Prout |
mov ecx, 549 |
call TConsole_Prout |
jmp .L705 |
.L5000: |
call TConsole_ScrollUp |
mcLoadLocal esi, loc47.pTrekData |
mov [esi + TREKDATA.ALIVE], 0 |
mcZeroBits edx |
mcZeroBits eax |
mov al, CHAR_FQUEENE |
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE |
cmove edx, eax |
mov [esi + TREKDATA.SHIP], dl |
cmp [esi + TREKDATA.REMKL], 0 |
je .L5050 |
fld [esi + TREKDATA.REMRES] |
fld [esi + TREKDATA.INRESOR] |
fdivp |
fstp [esp + loc47.dbl_Goodies] |
mov al, [esi + TREKDATA.REMCOM] |
add al, al |
add al, [esi + TREKDATA.REMKL] |
call TCommon_LoadByteIntoFPU |
mov al, [esi + TREKDATA.INCOM] |
add al, al |
add al, [esi + TREKDATA.INKLING] |
call TCommon_LoadByteIntoFPU |
fdivp |
fstp [esp + loc47.dbl_Baddies] |
fld [esp + loc47.dbl_Goodies] |
fld [esp + loc47.dbl_Baddies] |
fdivp |
fstp [esp + loc47.dbl_Advantage] |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
fmulp |
fld1 |
faddp |
fld [esp + loc47.dbl_Advantage] |
mc_CMP_ST0_ST1 |
jc .L5020 |
mov ecx, 550 |
call TConsole_Prout |
mov ecx, 551 |
call TConsole_Prout |
call TRandom_Ranf |
fld [glb_dbl_3] |
faddp |
fld [esp + loc47.dbl_Advantage] |
mc_CMP_ST0_ST1 |
jc .L5010 |
mov ecx, 552 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 555 |
call TConsole_Prout |
jmp .L5030 |
.L5010: |
mov ecx, 553 |
call TConsole_Prout |
jmp .L5030 |
.L5020: |
mov ecx, 554 |
call TConsole_Prout |
jmp .L5030 |
.L5050: |
mov ecx, 556 |
call TConsole_Prout |
mov ecx, 557 |
call TConsole_Prout |
mov ecx, 558 |
call TConsole_Prout |
mov ecx, 559 |
call TConsole_Prout |
mcLoadLocal ebx, loc47.pTrekData |
mov [ebx + TREKDATA.GAMEWON], 1 |
mov [ebx + TREKDATA.ALIVE], 0 |
.L5030: |
call TGame_Score |
.done: |
mcEndLocals loc47.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TFormat.Asm |
---|
0,0 → 1,155 |
; -------------------------------------------------------------------------- |
; FILE: TFormat.Asm |
; DATE: October 7, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; EDI = ANSI buffer |
; EAX = value to format |
; Output: |
; ECX = length of text |
; NOTE: |
; All registers are safe |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc18: |
.buffer CHARS 12 |
.nChars INT32 ? |
.bSigned BOOL ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TFormat_Int32: |
push edx eax esi edi |
mcBeginLocals loc18.size |
mcLoadLocalRef esi, loc18.nChars |
mcLoad8bitsToReg32 ecx, 10 |
mcZeroBits edx |
mcStoreLocal loc18.nChars, edx |
mcStoreLocal loc18.bSigned, edx |
add eax, edx |
jns .div_10 |
neg eax |
inc [esp + loc18.bSigned] |
.div_10: |
mcZeroBits edx |
div ecx |
add dl, '0' |
dec esi |
mov [esi], dl |
inc [esp + loc18.nChars] |
mcOnRegNotZero eax, .div_10 |
cmp [esp + loc18.bSigned], 0 |
je .copy |
dec esi |
mov byte [esi], '-' |
inc [esp + loc18.nChars] |
.copy: |
mcLoadLocal ecx, loc18.nChars |
push ecx |
rep movsb |
stosb |
pop ecx |
mcEndLocals loc18.size |
pop edi esi eax edx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ST(0) = value to format |
; EDI = ANSI buffer |
; CL = number of digits after dot |
; Output: |
; ECX = length of text |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc17: |
.dbl_Value DOUBLE ? |
.buf_AllDigits CHARS 10 |
.nValue INT32 ? |
.nDigits INT32 ? |
.pszBuffer PCHAR ? |
.bSigned BOOL ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TFormat_Double: |
push eax ebx esi edi |
mcBeginLocals loc17.size |
.prepare: |
mcStoreLocal loc17.pszBuffer, edi |
movzx ecx, cl |
mcStoreLocal loc17.nDigits, ecx |
fld1 |
.make_factor: |
fld [glb_dbl_Ten] |
fmulp |
loop .make_factor |
fmulp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc17.nValue, eax |
mcLoadLocalRef edi, loc17.buf_AllDigits |
call TFormat_Int32 |
cmp ecx, [esp + loc17.nDigits] |
ja .print_all |
mcLoadLocal ebx, loc17.pszBuffer |
mov byte [ebx], '0' |
mov byte [ebx + 1], '.' |
je .copy_all_at_EBX |
mov al, [edi] |
mov byte [ebx + 2], '0' |
mov byte [ebx + 3], al |
mov byte [ebx + 4], 0 |
jmp .done |
.copy_all_at_EBX: |
mov esi, edi |
lea edi, [ebx + 2] |
inc ecx |
rep movsb |
jmp .done |
.print_all: |
mov esi, edi |
mcLoadLocal edi, loc17.pszBuffer |
sub ecx, [esp + loc17.nDigits] |
rep movsb |
mov al, '.' |
stosb |
mov ecx, [esp + loc17.nDigits] |
inc ecx |
rep movsb |
.done: |
mcLoadLocal esi, loc17.pszBuffer |
call TCmdBuf_AnsiStrLen |
mcEndLocals loc17.size |
pop edi esi ebx eax |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TGame.Asm |
---|
0,0 → 1,2420 |
; -------------------------------------------------------------------------- |
; FILE: TGame.Asm |
; DATE: September 28, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; WAIT |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc48: |
.pTrekData PVOID ? |
.dbl_TEMP DOUBLE ? |
.dbl_ANUM DOUBLE ? |
.dbl_AITEM2 DOUBLE ? |
.dbl_ DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Wait: |
mcBeginLocals loc48.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc48.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
.L10: |
call TCmdBuf_Scan |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc48.dbl_ANUM] |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L20 |
mov ecx, 560 |
call TGame_Prompt |
jmp .L10 |
.L20: |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L60 |
fldz |
fld [esp + loc48.dbl_ANUM] |
mc_CMP_ST0_ST1 |
jc .done |
jz .done |
mcLoadLocal esi, loc48.pTrekData |
fld [esi + TREKDATA.REMTIME] |
fld [esp + loc48.dbl_ANUM] |
mc_CMP_ST0_ST1 |
jnc .verify |
cmp [esi + TREKDATA.NENHERE], 0 |
je .L30 |
.verify: |
mcLoad8bitsToReg32 ecx, 158 |
call TGame_JA |
jnc .done |
.L30: |
mcLoadLocal esi, loc48.pTrekData |
inc [esi + TREKDATA.RESTING] |
fld [esp + loc48.dbl_ANUM] |
fstp [esp + loc48.dbl_AITEM2] |
.L40: |
fldz |
fld [esp + loc48.dbl_ANUM] |
mc_CMP_ST0_ST1 |
jc .stop_rest |
jz .stop_rest |
.still_resting: |
mcLoadLocal esi, loc48.pTrekData |
cmp [esi + TREKDATA.RESTING], 0 |
je .L50 |
fld [esp + loc48.dbl_ANUM] |
fstp [esp + loc48.dbl_TEMP] |
cmp [esi + TREKDATA.NENHERE], 0 |
je .set_time |
call TRandom_Ranf |
fld1 |
faddp |
fld [esp + loc48.dbl_ANUM] |
call TCommon_FPU_Min |
fstp [esp + loc48.dbl_TEMP] |
.set_time: |
fld [esp + loc48.dbl_TEMP] |
mcLoadLocal edi, loc48.pTrekData |
fstp [edi + TREKDATA.TIME] |
fld [esp + loc48.dbl_ANUM] |
fld [edi + TREKDATA.TIME] |
mc_CMP_ST0_ST1 |
jnc .check_tholian |
call TAttack_Main |
.check_tholian: |
mcLoadLocal esi, loc48.pTrekData |
cmp [esi + TREKDATA.NENHERE], 0 |
jne .call_events |
call TEvents_MoveTholian |
.call_events: |
mcLoadLocal esi, loc48.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
call TEvents_Main |
mcLoadLocal edi, loc48.pTrekData |
mov [edi + TREKDATA.IDIDIT], 1 |
cmp [edi + TREKDATA.ALLDONE], 0 |
jne .done |
fld [esp + loc48.dbl_ANUM] |
fld [esp + loc48.dbl_TEMP] |
fsubp |
fstp [esp + loc48.dbl_ANUM] |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
jne .L40 |
mcLoadLocal esi, loc48.pTrekData |
mov [esi + TREKDATA.RESTING], 0 |
fldz |
fstp [esi + TREKDATA.TIME] |
jmp .L55 |
.stop_rest: |
mcLoadLocal esi, loc48.pTrekData |
mov [esi + TREKDATA.RESTING], 0 |
.L50: |
call TConsole_SetGameMsgAttr |
mcLoadLocal esi, loc48.pTrekData |
fld [esi + TREKDATA.REMTIME] |
mov cl, 2 |
call TConsole_CramFloat |
mov ecx, 561 |
call TConsole_Prout |
.L55: |
mcLoadLocal esi, loc48.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .done |
; |
; Repair Death Ray! |
; |
fld [glb_dbl_9dot99] |
fld [esp + loc48.dbl_AITEM2] |
fld [esp + loc48.dbl_ANUM] |
fsubp |
mc_CMP_ST0_ST1 |
jc .done |
fldz |
mov cl, DEV_DEATHRAY |
call TArray_SetDblDamage |
jmp .done |
.L60: |
call TMove_BegPardon |
.done: |
mcEndLocals loc48.size |
ret |
; -------------------------------------------------------------------------- |
; GAME |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc42: |
.pTrekData PVOID ? |
.nKILLTOT COUNT ? |
.nDESTBAS COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Report: |
mcBeginLocals loc42.size |
mcLoadGameDataPtr eax |
mcStoreLocal loc42.pTrekData, eax |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 309 |
call TConsole_Cram |
mcLoadLocal esi, loc42.pTrekData |
mov al, [esi + TREKDATA.LENGTH] |
mcOnRegEqu al, 1, .short_game |
mcOnRegEqu al, 2, .medium_game |
mcOnRegEqu al, 4, .long_game |
.assertion_failed: |
;int 3 |
jmp .done |
.short_game: |
push 74 |
jmp .print_length |
.medium_game: |
push 75 |
jmp .print_length |
.long_game: |
push 76 |
.print_length: |
pop ecx |
call TConsole_Cram |
mov al, CHAR_BLANK |
call TConsole_PutChar |
mcLoadLocal esi, loc42.pTrekData |
movzx eax, [esi + TREKDATA.SKILL] |
cmp al, 1 |
jb .assertion_failed |
cmp al, 5 |
ja .assertion_failed |
lea ecx, [eax + 12] |
call TConsole_Cram |
mov ecx, 310 |
call TConsole_Prout |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.IDIDIT], 0 |
je .L110 |
mov ecx, 311 |
call TConsole_Cram |
mcLoadLocal esi, loc42.pTrekData |
add esi, TREKDATA.PASSWD |
mcZeroBits eax |
.get_char: |
lodsb |
mcOnRegZero eax, .end_of_password |
call TConsole_PutChar |
jmp .get_char |
.end_of_password: |
mov ecx, 312 |
call TConsole_Prout |
.L110: |
mcLoadLocal esi, loc42.pTrekData |
mov al, [esi + TREKDATA.KILLK] |
add al, [esi + TREKDATA.KILLC] |
add al, [esi + TREKDATA.NSCKILL] |
movzx eax, al |
mcStoreLocal loc42.nKILLTOT, eax |
call TConsole_CramInt |
mov ecx, 313 |
call TConsole_Cram |
mcLoad8bitsToReg32 ecx, 204 |
mcLoadLocal esi, loc42.pTrekData |
movzx eax, [esi + TREKDATA.INKLING] |
call TConsole_CramSinglePlural |
mov ecx, 314 |
mcZeroBits eax |
cmp [esp + loc42.nKILLTOT], 1 |
sete al |
add ecx, eax |
call TConsole_Cram |
mcLoad8bitsToReg32 ecx, 205 |
mcLoadLocal esi, loc42.pTrekData |
movzx eax, [esi + TREKDATA.KILLC] |
call TConsole_CramSinglePlural |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.SKILL], 2 |
jbe .L200 |
mov ecx, 316 |
call TConsole_Cram |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.NSCREM], 1 |
jne .scom_news |
mov ecx, 317 |
call TConsole_Cram |
.scom_news: |
mov ecx, 318 |
call TConsole_Prout |
.L200: |
mcLoadLocal esi, loc42.pTrekData |
mov al, [esi + TREKDATA.INBASE] |
sub al, [esi + TREKDATA.REMBASE] |
movzx eax, al |
mcStoreLocal loc42.nDESTBAS, eax |
mcOnRegZero eax, .L210 |
mov ecx, 319 |
call TConsole_CramSinglePlural |
mov ecx, 320 |
call TConsole_Cram |
.L210: |
mcLoadLocal esi, loc42.pTrekData |
mov ecx, 319 |
movzx eax, [esi + TREKDATA.REMBASE] |
call TConsole_CramSinglePlural |
cmp [esp + loc42.nDESTBAS], 0 |
je .end_of_bases |
mov ecx, 321 |
call TConsole_Cram |
.end_of_bases: |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.ICSOS], 0 |
je .L240 |
fld [esi + TREKDATA.FUTURE5] |
fld [glb_dbl_1E38] |
mc_CMP_ST0_ST1 |
jc .L240 |
jz .L240 |
cmp [esi + TREKDATA.REMCOM], 0 |
je .L240 |
cmp [esi + TREKDATA.REMBASE], 0 |
je .L240 |
cmp [esi + TREKDATA.BATX], 0 |
je .L240 |
cmp [esi + TREKDATA.BATY], 0 |
je .L240 |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
call TArray_GetGalaxyValue |
mcLoad8bitsToReg32 eax, 100 |
xchg eax, ecx |
mcZeroBits edx |
div ecx |
cmp edx, 10 |
jb .L240 |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
movzx ecx, [esi + TREKDATA.REMCOM] |
lea edi, [esi + TREKDATA.CY] |
add esi, TREKDATA.CX |
.find_commander: |
cmp al, [esi] |
jne .next_commander |
cmp dl, [edi] |
je .L221 |
.next_commander: |
inc esi |
inc edi |
loop .find_commander |
jmp .L240 |
.L221: |
mov ecx, 322 |
call TConsole_Cram |
mcLoadLocal esi, loc42.pTrekData |
mov al, [esi + TREKDATA.BATX] |
mov dl, [esi + TREKDATA.BATY] |
mov cl, 1 |
call TConsole_CramLoc |
mov ecx, 323 |
call TConsole_Prout |
mov ecx, 324 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal esi, loc42.pTrekData |
fld [esi + TREKDATA.FUTURE5] |
call TConsole_CramFloat |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
.L240: |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.ISSOS], 0 |
je .L245 |
cmp [esi + TREKDATA.ISATB], 1 |
jne .L245 |
mov ecx, 322 |
call TConsole_Cram |
mcLoadLocal esi, loc42.pTrekData |
mov al, [esi + TREKDATA.ISX] |
mov dl, [esi + TREKDATA.ISY] |
mov cl, 1 |
call TConsole_CramLoc |
mov ecx, 325 |
call TConsole_Prout |
mov ecx, 324 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal esi, loc42.pTrekData |
fld [esi + TREKDATA.FUTURE7] |
call TConsole_CramFloat |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
.L245: |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.ISUBDAM], 0 |
je .L249 |
mov ecx, 328 |
call TConsole_Cram |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_GetDblDamage |
fldz |
mcZeroBits eax |
mc_CMP_ST0_ST1 |
setz al |
lea ecx, [eax + 326] |
call TConsole_Cram |
mov ecx, 329 |
call TConsole_Prout |
mov ecx, 330 |
call TConsole_Prout |
.L249: |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.CASUAL], 0 |
je .L250 |
movzx eax, [esi + TREKDATA.CASUAL] |
call TConsole_CramInt |
mov ecx, 331 |
call TConsole_Prout |
.L250: |
mcLoadLocal esi, loc42.pTrekData |
cmp [esi + TREKDATA.NHELP], 0 |
je .L260 |
movzx eax, [esi + TREKDATA.NHELP] |
mov ecx, 332 |
call TConsole_CramSinglePlural |
mov ecx, 333 |
call TConsole_Cram |
call TConsole_ScrollUp |
.L260: |
call TConsole_ScrollUp |
.done: |
mcEndLocals loc42.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = value in range [1..8] |
; Output: |
; CF=TRUE if value is in range |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_IsValidQuadrant: |
cmp eax, 1 |
jb .failed |
cmp eax, 8 |
ja .failed |
stc |
ret |
.failed: |
clc |
ret |
; -------------------------------------------------------------------------- |
; GETFN |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = PCHAR - buffer to store the name into |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc88: |
.pszBuffer PCHAR ? |
.nAskThreeTimes COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_GetFileName: |
mcBeginLocals loc88.size |
mcStoreLocal loc88.pszBuffer, esi |
mcLoad8bitsToReg32 eax, 3 |
mcStoreLocal loc88.nAskThreeTimes, eax |
.L40: |
call TCmdBuf_Scan |
mov al, [ebx + TCmdBuf.cmdbuf_KEY] |
mcOnRegEqu al, CMD_TOKEN_EOL, .L75 |
mcOnRegNotEqu al, CMD_TOKEN_ALPHA, .L100 |
call TCmdBuf_AnsiStrLen |
cmp ecx, 27 |
ja .too_long |
mcLoadLocal edi, loc88.pszBuffer |
call TString_AnsiCopy |
dec edi |
mov esi, str_TRK |
call TString_AnsiCopy |
jmp .done |
.too_long: |
mov ecx, 668 |
call TConsole_ProutGameMsg |
jmp .ask |
.L75: |
dec [esp + loc88.nAskThreeTimes] |
jz .L100 |
.ask: |
mov ecx, 665 |
call TGame_Prompt |
jmp .L40 |
.L100: |
mcLoadLocal esi, loc88.pszBuffer |
mov byte [esi], 0 |
.done: |
mcEndLocals loc88.size |
ret |
; -------------------------------------------------------------------------- |
; SCORE |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc57: |
.pTrekData PVOID ? |
.dbl_TIMUSED DOUBLE ? |
.dbl_PERDATE DOUBLE ? |
.dbl_ITHPERD DOUBLE ? |
.dbl_pad_1 DOUBLE ? |
.nISCORE INT32 ? |
.nIWON INT32 ? |
.nIDIED INT32 ? |
.nKLSHIP INT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Score: |
mcBeginLocals loc57.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc57.pTrekData, esi |
fld [esi + TREKDATA.DATE] |
fld [esi + TREKDATA.INDATE] |
fsubp |
fstp [esp + loc57.dbl_TIMUSED] |
fld [esp + loc57.dbl_TIMUSED] |
fldz |
mc_CMP_ST0_ST1 |
jz .recalc_time_used |
cmp [esi + TREKDATA.REMKL], 0 |
je .calc_per_date |
.recalc_time_used: |
fld [esp + loc57.dbl_TIMUSED] |
fld [glb_dbl_5] |
call TCommon_FPU_Max |
fstp [esp + loc57.dbl_TIMUSED] |
.calc_per_date: |
mov al, [esi + TREKDATA.KILLC] |
add al, [esi + TREKDATA.KILLK] |
add al, [esi + TREKDATA.NSCKILL] |
call TCommon_LoadByteIntoFPU |
fld [esp + loc57.dbl_TIMUSED] |
fdivp |
fld st |
fstp [esp + loc57.dbl_PERDATE] |
fstp [glb_dbl_KlingonsPerDate] |
fld [esp + loc57.dbl_PERDATE] |
fld [glb_dbl_500] |
fmulp |
fld [glb_dbl_0dot5] |
faddp |
fstp [esp + loc57.dbl_ITHPERD] |
mcZeroBits eax |
mcStoreLocal loc57.nIWON, eax |
cmp [esi + TREKDATA.GAMEWON], 0 |
je .check_ship |
movzx eax, [esi + TREKDATA.SKILL] |
imul eax, 100 |
mcStoreLocal loc57.nIWON, eax |
.check_ship: |
mov al, [esi + TREKDATA.SHIP] |
mcOnRegEqu al, CHAR_ENTERPRISE, .killed_zero_ships |
mcOnRegEqu al, CHAR_FQUEENE, .killed_one_ship |
mcOnRegZero al, .killed_two_ships |
;int 3 |
jmp .done |
.killed_zero_ships: |
push 0 |
jmp .store_killed_ships |
.killed_one_ship: |
push 1 |
jmp .store_killed_ships |
.killed_two_ships: |
push 2 |
.store_killed_ships: |
pop edx |
mcStoreLocal loc57.nKLSHIP, edx |
mcZeroBits eax |
cmp [esi + TREKDATA.ALIVE], 0 |
jne .I_died |
add eax, 200 |
.I_died: |
mcStoreLocal loc57.nIDIED, eax |
cmp [esi + TREKDATA.GAMEWON], 0 |
jne .calc_total_score |
mov [esi + TREKDATA.NROMREM], 0 |
.calc_total_score: |
movzx eax, [esi + TREKDATA.KILLK] |
imul eax, 10 |
mcStoreLocal loc57.nISCORE, eax |
movzx eax, [esi + TREKDATA.KILLC] |
imul eax, 50 |
add [esp + loc57.nISCORE], eax |
fld [esp + loc57.dbl_ITHPERD] |
call TCommon_FP_Truncate |
add [esp + loc57.nISCORE], eax |
mcLoadLocal eax, loc57.nIWON |
add [esp + loc57.nISCORE], eax |
mcLoadLocal eax, loc57.nIDIED |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.BASEKL] |
imul eax, 100 |
sub [esp + loc57.nISCORE], eax |
mcLoadLocal eax, loc57.nKLSHIP |
imul eax, 100 |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.NHELP] |
imul eax, 45 |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.STARKL] |
imul eax, 5 |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.CASUAL] |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.NROMKL] |
imul eax, 20 |
add [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.NSCKILL] |
imul eax, 200 |
add [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.NPLANKL] |
imul eax, 10 |
sub [esp + loc57.nISCORE], eax |
movzx eax, [esi + TREKDATA.NROMREM] |
add [esp + loc57.nISCORE], eax |
; |
; Report all that... |
; |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
call TConsole_ScrollUp |
mov ecx, 632 |
call TConsole_Prout |
call TConsole_ScrollUp |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.NROMKL], 0 |
je .L1 |
movzx eax, [esi + TREKDATA.NROMKL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 633 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.NROMKL] |
imul eax, 20 |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L1: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.NROMREM], 0 |
je .L5 |
movzx eax, [esi + TREKDATA.NROMREM] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 634 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.NROMREM] |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L5: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.KILLK], 0 |
je .L10 |
movzx eax, [esi + TREKDATA.KILLK] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 635 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.KILLK] |
imul eax, 10 |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L10: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.KILLC], 0 |
je .L12 |
movzx eax, [esi + TREKDATA.KILLC] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 636 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.KILLC] |
imul eax, 50 |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L12: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.NSCKILL], 0 |
je .L15 |
movzx eax, [esi + TREKDATA.NSCKILL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 637 |
call TConsole_Prout |
.L15: |
fld [esp + loc57.dbl_ITHPERD] |
fldz |
mc_CMP_ST0_ST1 |
jz .L20 |
fld [esp + loc57.dbl_PERDATE] |
mov cl, 2 |
mov dl, 6 |
call TConsole_CramFloatWidth |
mov ecx, 638 |
call TConsole_Cram |
fld [esp + loc57.dbl_ITHPERD] |
call TCommon_FP_Truncate |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L20: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.STARKL], 0 |
je .L30 |
movzx eax, [esi + TREKDATA.STARKL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 639 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.STARKL] |
imul eax, 5 |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L30: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.NPLANKL], 0 |
je .L32 |
movzx eax, [esi + TREKDATA.NPLANKL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 640 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.NPLANKL] |
imul eax, 10 |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L32: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.BASEKL], 0 |
je .L35 |
movzx eax, [esi + TREKDATA.BASEKL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 641 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.BASEKL] |
imul eax, 100 |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L35: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.NHELP], 0 |
je .L40 |
movzx eax, [esi + TREKDATA.NHELP] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 642 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.NHELP] |
imul eax, 45 |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L40: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.CASUAL], 0 |
je .L45 |
movzx eax, [esi + TREKDATA.CASUAL] |
mov cl, 6 |
call TConsole_CramIntWidth |
mov ecx, 643 |
call TConsole_Cram |
mcLoadLocal esi, loc57.pTrekData |
movzx eax, [esi + TREKDATA.CASUAL] |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L45: |
cmp [esp + loc57.nKLSHIP], 0 |
je .L50 |
mov cl, 6 |
mcLoadLocal eax, loc57.nKLSHIP |
call TConsole_CramIntWidth |
mov ecx, 644 |
call TConsole_Cram |
mcLoadLocal eax, loc57.nKLSHIP |
imul eax, 100 |
mov cl, 10 |
neg eax |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L50: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.ALIVE], 0 |
jne .L60 |
mov ecx, 645 |
call TConsole_Prout |
.L60: |
mcLoadLocal esi, loc57.pTrekData |
cmp [esi + TREKDATA.GAMEWON], 0 |
je .L70 |
mov ecx, 646 |
call TConsole_Cram |
movzx ecx, [esi + TREKDATA.SKILL] |
add ecx, 646 |
call TConsole_Cram |
mcLoadLocal eax, loc57.nIWON |
mov cl, 25 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.L70: |
call TConsole_ScrollUp |
mov ecx, 652 |
call TConsole_Cram |
mcLoadLocal eax, loc57.nISCORE |
mov [glb_Score], eax |
mov cl, 10 |
call TConsole_CramIntWidth |
call TConsole_ScrollUp |
.done: |
mcEndLocals loc57.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of the message table |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Prompt: |
push ebx |
push ecx |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
pop ecx |
call TConsole_Cram |
call TConsole_RefreshCaretLine |
lock dec [glb_GameThreadBusy] |
.check_if_cmd_complete: |
mcZeroBits eax |
lock add [glb_GameThreadBusy], eax |
jnz .done |
invoke Sleep, eax |
jmp .check_if_cmd_complete |
.done: |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; JA |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = prompt text index |
; Output: |
; CF=1 if user answered "YES" |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc27: |
.nMsgIndex INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_JA: |
mcBeginLocals loc27.size |
mcStoreLocal loc27.nMsgIndex, ecx |
.ask: |
mcLoadLocal ecx, loc27.nMsgIndex |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .ask |
mcLoad8bitsToReg32 ecx, 159 |
call TCmdBuf_Crop |
jc .return_yes |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jc .return_no |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 160 |
call TConsole_Prout |
call TConsole_ScrollUp |
jmp .ask |
.return_yes: |
mcEndLocals loc27.size |
stc |
ret |
.return_no: |
mcEndLocals loc27.size |
clc |
ret |
; -------------------------------------------------------------------------- |
; FREEZE |
; -------------------------------------------------------------------------- |
; glb_bEmExit = 0 means normal freezing |
; glb_bEmExit = 1 means freezing into EMSAVE.TRK |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc89: |
.strFileName CHARS 32 |
.hFile HANDLE ? |
.dwSize COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Freeze: |
mcBeginLocals loc89.size |
mcLoadGameDataPtr edi |
mov [edi + TREKDATA.IDIDIT], 0 |
cmp [glb_bEmExit], 1 |
je .emergency_exit |
.ask_fname: |
mcLoadLocalRef esi, loc89.strFileName |
call TGame_GetFileName |
cmp byte [esp], 0 |
je .L920 |
invoke GetFileAttributes, esp |
mcOnRegEqu eax, -1, .save |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
mov ecx, 669 |
call TConsole_Cram |
mov esi, esp |
call TConsole_CramAnsi |
mov ecx, 670 |
call TGame_JA |
jnc .ask_fname |
jmp .save |
.emergency_exit: |
mov esi, str_EmSaveGame |
mov edi, esp |
call TString_AnsiCopy |
.save: |
mcZeroBits eax |
mcStoreLocal loc89.dwSize, eax |
mov esi, esp |
invoke CreateFileAnsi, esi, GENERIC_WRITE, 0, 0,\ |
CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0 |
mcStoreLocal loc89.hFile, eax |
mcOnRegEqu eax, -1, .L920 |
mov esi, [glb_pCommon] |
mov ecx, TCommon.size |
mcLoadLocal ebx, loc89.hFile |
mcLoadLocalRef edi, loc89.dwSize |
invoke WriteFile, ebx, esi, ecx, edi, 0 |
invoke CloseHandle, ebx |
mov ecx, TCommon.size |
cmp [edi], ecx |
jne .L920 |
.file_stored: |
mcLoadGameDataPtr edi |
inc [edi + TREKDATA.IDIDIT] |
mov ecx, 666 |
call TConsole_ProutGameMsg |
jmp .done |
.L920: |
mov ecx, 667 |
call TConsole_ProutGameMsg |
.done: |
mcEndLocals loc89.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Prelim: |
mcLoad8bitsToReg32 ecx, 92 |
call TConsole_ProutGameMsg |
dec ecx |
call TConsole_Prout |
mcLoad1 ecx |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 91 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
dec ecx |
call TConsole_Prout |
mov ecx, 654 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 91 |
call TConsole_Prout |
mov ecx, 657 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 91 |
call TConsole_Prout |
mov ecx, 659 |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
inc ecx |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 91 |
call TConsole_Prout |
call TConsole_Prout |
mov ecx, 663 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 92 |
call TConsole_Prout |
mov cl, 5 |
call TConsole_Skip |
ret |
; -------------------------------------------------------------------------- |
; ESI = points to file name |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_CutTheExtension: |
mov edi, esi |
mov al, '.' |
mcLoadNeg1 ecx |
repne scasb |
dec edi |
mov byte [edi], 0 |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc101: |
.fileInfo rb WIN32_FIND_DATA.size |
.hFind HANDLE ? |
.nFilesPerLine COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_ListFrozenGames: |
mcBeginLocals loc101.size |
invoke FindFirstFile, str_FileMask, esp |
mcStoreLocal loc101.hFind, eax |
mcOnRegEqu eax, -1, .done |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
call TConsole_ScrollUp |
mov ecx, 709 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov [esp + loc101.nFilesPerLine], 4 |
.list_that_file: |
mov eax, [esp + WIN32_FIND_DATA.dwAttr] |
test eax, FILE_ATTR_DIR |
jnz .next |
mov cl, 2 |
call TConsole_RepeatBlank |
lea esi, [esp + WIN32_FIND_DATA.strName] |
call TGame_CutTheExtension |
call TConsole_CramWide |
dec [esp + loc101.nFilesPerLine] |
jnz .next |
mov [esp + loc101.nFilesPerLine], 4 |
call TConsole_ScrollUp |
.next: |
mcLoadLocal edx, loc101.hFind |
invoke FindNextFile, edx, esp |
mcOnRegNotZero eax, .list_that_file |
call TConsole_ScrollUp |
cmp [esp + loc101.nFilesPerLine], 4 |
je .done |
call TConsole_ScrollUp |
.done: |
mcEndLocals loc101.size |
ret |
; -------------------------------------------------------------------------- |
; THAW |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc87: |
.fileName CHARS 32 |
.hFile HANDLE ? |
.dwSize COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Thaw: |
mcBeginLocals loc87.size |
mcLoadGameDataPtr edi |
mov [edi + TREKDATA.IDIDIT], 0 |
.ask_fname: |
mov esi, esp |
call TGame_GetFileName |
cmp byte [esp], 0 |
je .L800 |
invoke GetFileAttributes, esp |
mcOnRegEqu eax, -1, .no_such_file |
mov esi, esp |
invoke CreateFileAnsi, esi, GENERIC_READ, 0, 0,\ |
OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0 |
mcStoreLocal loc87.hFile, eax |
mcOnRegEqu eax, -1, .L800 |
mov esi, [glb_pCommon] |
mov ecx, TCommon.size |
mcLoadLocal ebx, loc87.hFile |
mcLoadLocalRef edi, loc87.dwSize |
mov dword [edi], 0 |
invoke ReadFile, ebx, esi, ecx, edi, 0 |
invoke CloseHandle, ebx |
mov ecx, TCommon.size |
cmp [edi], ecx |
jne .L800 |
mov ecx, 671 |
call TConsole_ProutGameMsg |
jmp .done |
.no_such_file: |
mov esi, esp |
mov edi, str_CmdListGames |
call TString_AnsiEqual |
jc .list_all_files |
mov ecx, 673 |
call TConsole_ProutGameMsg |
jmp .ask_fname |
.list_all_files: |
call TGame_ListFrozenGames |
jmp .ask_fname |
.L800: |
; |
; Game was not loaded |
; |
mcLoadGameDataPtr edi |
add edi, TREKDATA.PASSWD |
mov byte [edi], 0 |
mov ecx, 672 |
call TConsole_ProutGameMsg |
.done: |
mcEndLocals loc87.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = token for hashing and initializing the RNG |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_InitTournament: |
mcZeroBits eax |
mcZeroBits edx |
.next_char: |
mov dl, [esi] |
inc esi |
mcOnRegZero edx, .seed_RNG_with_EAX |
shl eax, 5 |
xor al, dl |
jmp .next_char |
.seed_RNG_with_EAX: |
call TRandom_Seed |
mcLoadGameDataPtr ebx |
mcLoadNeg1 eax |
mcStoreMember TREKDATA.THINGX, al |
mcStoreMember TREKDATA.THINGY, al |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; ECX = TRUE if FROZEN game is selected |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc10: |
.bFrozen BOOL ? |
.pszToken PCHAR ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Choose: |
mcBeginLocals loc10.size |
mcZeroBits eax |
mcLoadGameDataPtr edi |
mov ecx, TREKDATA.size |
rep stosb |
.L5: |
mcZeroBits eax |
mcStoreLocal loc10.bFrozen, eax |
mcLoad8bitsToReg32 ecx, 3 |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .L5 |
mcLoad8bitsToReg32 ecx, 10 |
call TCmdBuf_Crop |
jc .L9 |
mcLoad8bitsToReg32 ecx, 11 |
call TCmdBuf_Crop |
jc .L100 |
mcLoad8bitsToReg32 ecx, 12 |
call TCmdBuf_Crop |
jc .L200 |
jmp .L5 |
.L9: |
mcZeroBits eax |
mcLoadGameDataPtr ebx |
mcStoreMember TREKDATA.SKILL, al |
mcStoreMember TREKDATA.LENGTH, al |
.L10: |
call TCmdBuf_Scan |
mcStoreLocal loc10.pszToken, esi |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
jne .L20 |
; |
; Check for different kinds of games |
; |
mcZeroBits eax |
mov ebx, [glb_pGameData] |
mcStoreMember TREKDATA.KSTUF5, al |
mcLoad8bitsToReg32 ecx, 74 |
call TCmdBuf_Crop |
jnc .check_medium |
mov [ebx + TREKDATA.LENGTH], 1 |
.check_medium: |
mcLoad8bitsToReg32 ecx, 75 |
call TCmdBuf_Crop |
jnc .check_long |
mov [ebx + TREKDATA.LENGTH], 2 |
.check_long: |
mcLoad8bitsToReg32 ecx, 76 |
call TCmdBuf_Crop |
jnc .check_novice |
mov [ebx + TREKDATA.LENGTH], 4 |
.check_novice: |
mcLoad8bitsToReg32 ecx, 13 |
call TCmdBuf_Crop |
jnc .check_fair |
mov [ebx + TREKDATA.SKILL], 1 |
.check_fair: |
mcLoad8bitsToReg32 ecx, 14 |
call TCmdBuf_Crop |
jnc .check_good |
mov [ebx + TREKDATA.SKILL], 2 |
.check_good: |
mcLoad8bitsToReg32 ecx, 15 |
call TCmdBuf_Crop |
jnc .check_expert |
mov [ebx + TREKDATA.SKILL], 3 |
.check_expert: |
mcLoad8bitsToReg32 ecx, 16 |
call TCmdBuf_Crop |
jnc .check_emeritus |
mov [ebx + TREKDATA.SKILL], 4 |
mov [ebx + TREKDATA.KSTUF5], 1 |
.check_emeritus: |
mcLoad8bitsToReg32 ecx, 17 |
call TCmdBuf_Crop |
jnc .check_both_entered |
mov [ebx + TREKDATA.SKILL], 5 |
mov [ebx + TREKDATA.KSTUF5], 2 |
.check_both_entered: |
cmp [ebx + TREKDATA.LENGTH], 0 |
je .L10 |
cmp [ebx + TREKDATA.SKILL], 0 |
je .L10 |
jmp .L30 |
.L20: |
mov ebx, [glb_pGameData] |
cmp [ebx + TREKDATA.LENGTH], 0 |
jne .L25 |
mcLoad8bitsToReg32 ecx, 4 |
call TGame_Prompt |
jmp .L10 |
.L25: |
cmp [ebx + TREKDATA.SKILL], 0 |
jne .L30 |
mcLoad8bitsToReg32 ecx, 5 |
call TGame_Prompt |
jmp .L10 |
.L30: |
; |
; Read in secret password |
; |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L40 |
.ask_password: |
mcLoad8bitsToReg32 ecx, 6 |
call TGame_Prompt |
jmp .L30 |
.L40: |
call TCmdBuf_AnsiStrLen |
cmp ecx, 8 |
ja .ask_password |
mov edi, [glb_pGameData] |
push edi |
add edi, TREKDATA.PASSWD |
inc ecx |
rep movsb |
pop edi |
; |
; Use parameters to generate initial game values |
; |
mov al, [edi + TREKDATA.SKILL] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_0dot5] |
fmulp |
fstp [edi + TREKDATA.DAMFAC] |
mcLoad8bitsToReg32 edx, 3 |
call TRandom_IRan |
add eax, 2 |
mov [edi + TREKDATA.REMBASE], al |
mcLoad8bitsToReg32 edx, 6 |
call TRandom_IRan |
add eax, 5 |
mov [edi + TREKDATA.INPLAN], al |
call TRandom_Ranf |
fld [glb_dbl_2] |
faddp |
mov al, [edi + TREKDATA.SKILL] |
call TCommon_LoadByteIntoFPU |
fmulp |
call TCommon_FP_Truncate |
mov [edi + TREKDATA.NROMREM], al |
movzx eax, [edi + TREKDATA.SKILL] |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 3 |
div ecx |
mov [edi + TREKDATA.NSCREM], al |
mov al, [edi + TREKDATA.LENGTH] |
call TCommon_LoadByteIntoFPU |
fld [glb_dbl_7] |
fmulp |
fld st |
fstp [edi + TREKDATA.REMTIME] |
fstp [edi + TREKDATA.INTIME] |
call TRandom_Ranf |
fld st |
faddp ; 2*RANF(0) |
mov al, [edi + TREKDATA.SKILL] |
call TCommon_LoadByteIntoFPU |
fsubrp ; SKILL - 2*RANF(0) |
fld1 |
faddp ; SKILL - 2*RAND(0) + 1.0 |
fild [glb_FPU_Int32] |
fmulp ; (SKILL - 2*RANF(0) + 1.0)*SKILL |
fld [glb_dbl_0dot1] |
fmulp ; (SKILL - 2*RANF(0) + 1.0)*SKILL*0.1 |
fld [glb_dbl_0dot15] |
faddp ; RATE = ... + 0.15 |
fld st |
faddp |
fld [edi + TREKDATA.INTIME] |
fmulp |
call TCommon_FP_Truncate |
mov [edi + TREKDATA.REMKL], al |
mov [edi + TREKDATA.INKLING], al |
call TCommon_LoadByteIntoFPU |
call TRandom_Ranf |
fmulp |
fld [glb_dbl_0dot0625] |
fmulp |
call TCommon_FP_Truncate |
add al, [edi + TREKDATA.SKILL] |
cmp al, 10 |
jbe .store_commander_count |
mov al, 10 |
.store_commander_count: |
mov [edi + TREKDATA.INCOM], al |
mov [edi + TREKDATA.REMCOM], al |
shl al, 2 |
add al, [edi + TREKDATA.INKLING] |
call TCommon_LoadByteIntoFPU |
fld [edi + TREKDATA.INTIME] |
fmulp |
fld st |
fstp [edi + TREKDATA.REMRES] |
fstp [edi + TREKDATA.INRESOR] |
cmp [edi + TREKDATA.INKLING], 50 |
jbe .store_initial_base_count |
inc [edi + TREKDATA.REMBASE] |
.store_initial_base_count: |
mov al, [edi + TREKDATA.REMBASE] |
mov [edi + TREKDATA.INBASE], al |
jmp .done |
.L100: |
; |
; Process a tournament request |
; |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .ask_tnumber |
call TGame_InitTournament |
jmp .L9 |
.ask_tnumber: |
mcLoad8bitsToReg32 ecx, 7 |
call TGame_Prompt |
jmp .L100 |
.L200: |
; |
; Frozen game requested |
; |
call TGame_Thaw |
mov esi, [glb_pGameData] |
cmp [esi + TREKDATA.PASSWD], 0 |
je .L5 |
; |
; Game loaded |
; |
inc [esp + loc10.bFrozen] |
mov ebx, [glb_pGameData] |
mcZeroBits eax |
mov [ebx + TREKDATA.THINGX], al |
mov [ebx + TREKDATA.THINGY], al |
lea esi, [ebx + TREKDATA.QUAD] |
mcLoad8bitsToReg32 ecx, 100 |
.erase_things: |
cmp byte [esi], CHAR_THING |
jne .no_thing |
mov byte [esi], CHAR_COSMOS |
.no_thing: |
inc esi |
loop .erase_things |
mov [ebx + TREKDATA.IDIDIT], 1 |
call TGame_Report |
.done: |
mcLoadLocal ecx, loc10.bFrozen |
mcEndLocals loc10.size |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_ListAllCommands: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 8 |
call TConsole_Prout |
mcLoad8bitsToReg32 edx, 8 |
mcLoad8bitsToReg32 ecx, 76 |
.next: |
inc ecx |
push edx |
call TConsole_Prout |
pop edx |
dec edx |
jnz .next |
call TConsole_ScrollUp |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc99: |
.OldSectX BYTE ? |
.OldSectY BYTE ? |
.NewSectX BYTE ? |
.NewSectY BYTE ? |
.CharEnemy BYTE ? |
.__align_1 BYTE ? |
.__align_2 BYTE ? |
.__align_3 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_DbgMoveEnemy: |
mcBeginLocals loc99.size |
mov ecx, 714 |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc99.OldSectX, al |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc99.OldSectY, al |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc99.NewSectX, al |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc99.NewSectY, al |
movzx eax, [esp + loc99.NewSectX] |
call TPhotons_IsValidSector |
jnc .done |
movzx eax, [esp + loc99.NewSectY] |
call TPhotons_IsValidSector |
jnc .done |
mcLoadGameDataPtr ebx |
mcZeroBits ecx |
mcLoadMember cl, TREKDATA.NENHERE |
jecxz .done |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcLoadLocal al, loc99.OldSectX |
mcLoadLocal dl, loc99.OldSectY |
.check_sector: |
cmp al, [esi] |
jne .next |
cmp dl, [edi] |
je .move_klingon |
.next: |
inc esi |
inc edi |
loop .check_sector |
jmp .done |
.move_klingon: |
mcLoadLocal al, loc99.NewSectX |
mcLoadLocal dl, loc99.NewSectY |
mov [esi], al |
mov [edi], dl |
mcLoadLocal al, loc99.OldSectX |
mcLoadLocal dl, loc99.OldSectY |
call TArray_QuadPtr |
mov al, [ebx] |
mov byte [ebx], CHAR_COSMOS |
mcStoreLocal loc99.CharEnemy, al |
mcLoadLocal al, loc99.NewSectX |
mcLoadLocal dl, loc99.NewSectY |
call TArray_QuadPtr |
mcLoadLocal al, loc99.CharEnemy |
mov [ebx], al |
call TCommon_SortKlingons |
.done: |
mcEndLocals loc99.size |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc98: |
.ShipQuadX BYTE ? |
.ShipQuadY BYTE ? |
.__align_1 BYTE ? |
.__align_2 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_DbgMoveShip: |
mcBeginLocals loc98.size |
mov ecx, 168 |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
call TGame_IsValidQuadrant |
jnc .done |
mcStoreLocal loc98.ShipQuadX, al |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .done |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
call TGame_IsValidQuadrant |
jnc .done |
mcStoreLocal loc98.ShipQuadY, al |
mcLoadGameDataPtr esi |
cmp al, [esi + TREKDATA.QUADY] |
jne .move_ship |
mov al, [esi + TREKDATA.QUADX] |
cmp [esp + loc98.ShipQuadX], al |
je .done |
.move_ship: |
mcLoadLocal al, loc98.ShipQuadX |
mcLoadLocal dl, loc98.ShipQuadY |
mov [esi + TREKDATA.QUADX], al |
mov [esi + TREKDATA.QUADY], dl |
call TCommon_NewQuad |
.done: |
mcEndLocals loc98.size |
ret |
; -------------------------------------------------------------------------- |
; PROGRAM STARTRK from original FORTRAN source |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TGame_Thread: |
mcProlog |
call TGame_Prelim |
.L10: |
call TGame_Choose |
mcOnRegNotZero ecx, .L15 |
call TCommon_Setup |
.L15: |
mov [glb_MOVED], 0 |
.L20: |
mov esi, [glb_pGameData] |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .L9999 |
.reset_before_cmd: |
mcZeroBits eax |
mov [esi + TREKDATA.JUSTIN], al |
mov [esi + TREKDATA.KDIDIT], al |
fldz |
fstp [esi + TREKDATA.TIME] |
mcLoad8bitsToReg32 ecx, 2 |
call TGame_Prompt |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .L20 |
mcLoad8bitsToReg32 ecx, 18 |
call TCmdBuf_Crop |
jc .L100 |
mcLoad8bitsToReg32 ecx, 26 |
call TCmdBuf_Crop |
jc .L200 |
mcLoad8bitsToReg32 ecx, 20 |
call TCmdBuf_Crop |
jc .L300 |
mcLoad8bitsToReg32 ecx, 24 |
call TCmdBuf_Crop |
jc .L400 |
mcLoad8bitsToReg32 ecx, 19 |
call TCmdBuf_Crop |
jc .L500 |
mcLoad8bitsToReg32 ecx, 28 |
call TCmdBuf_Crop |
jc .L600 |
mcLoad8bitsToReg32 ecx, 32 |
call TCmdBuf_Crop |
jc .L700 |
mcLoad8bitsToReg32 ecx, 34 |
call TCmdBuf_Crop |
jc .L800 |
mcLoad8bitsToReg32 ecx, 30 |
call TCmdBuf_Crop |
jc .L900 |
mcLoad8bitsToReg32 ecx, 23 |
call TCmdBuf_Crop |
jc .L1000 |
mcLoad8bitsToReg32 ecx, 31 |
call TCmdBuf_Crop |
jc .L1100 |
mcLoad8bitsToReg32 ecx, 27 |
call TCmdBuf_Crop |
jc .L1200 |
mcLoad8bitsToReg32 ecx, 22 |
call TCmdBuf_Crop |
jc .L1300 |
mcLoad8bitsToReg32 ecx, 36 |
call TCmdBuf_Crop |
jc .L1400 |
mcLoad8bitsToReg32 ecx, 37 |
call TCmdBuf_Crop |
jc .L1450 |
mcLoad8bitsToReg32 ecx, 38 |
call TCmdBuf_Crop |
jc .L1500 |
mcLoad8bitsToReg32 ecx, 39 |
call TCmdBuf_Crop |
jc .L1550 |
mcLoad8bitsToReg32 ecx, 40 |
call TCmdBuf_Crop |
jc .L1600 |
mcLoad8bitsToReg32 ecx, 41 |
call TCmdBuf_Crop |
jc .L1650 |
mcLoad8bitsToReg32 ecx, 42 |
call TCmdBuf_Crop |
jc .L1670 |
mcLoad8bitsToReg32 ecx, 43 |
call TCmdBuf_Crop |
jc .L1680 |
mcLoad8bitsToReg32 ecx, 45 |
call TCmdBuf_Crop |
jc .L1685 |
mcLoad8bitsToReg32 ecx, 46 |
call TCmdBuf_Crop |
jc .L1690 |
; |
; Non-abbreviated commands (checking) |
; |
mcLoad8bitsToReg32 ecx, 21 |
call TCmdBuf_Crop |
jc .L1700 |
mcLoad8bitsToReg32 ecx, 33 |
call TCmdBuf_Crop |
jc .L9000 |
mcLoad8bitsToReg32 ecx, 25 |
call TCmdBuf_Crop |
jc .L1900 |
mcLoad8bitsToReg32 ecx, 29 |
call TCmdBuf_Crop |
jc .L2000 |
mcLoad8bitsToReg32 ecx, 35 |
call TCmdBuf_Crop |
jc .L2100 |
mcLoad8bitsToReg32 ecx, 44 |
call TCmdBuf_Crop |
jc .L2200 |
mov ecx, 708 |
call TCmdBuf_Crop |
jc .L2300 |
; |
; Get help, mon! |
; |
call TGame_ListAllCommands |
jmp .L20 |
.L100: |
call TSrScan_Main |
jmp .L20 |
.L200: |
call TLrScan_Main |
jmp .L20 |
.L300: |
call TPhasers_Main |
.L305: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.IDIDIT], 0 |
je .L20 |
.L310: |
call TAttack_Main |
.L320: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.KDIDIT], 0 |
jne .L2500 |
jmp .L15 |
.L400: |
call TPhotons_Main |
.L410: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.IDIDIT], 0 |
je .L20 |
mov [glb_MOVED], 0 |
jmp .L2500 |
.L500: |
cmp [glb_MOVED], 0 |
je .L510 |
.L505: |
mov [glb_MOVED], 2 |
.L510: |
call TMove_Warp |
.L520: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.IDIDIT], 0 |
jne .L521 |
cmp [glb_MOVED], 2 |
jne .L521 |
dec [glb_MOVED] |
.L521: |
cmp [esi + TREKDATA.IDIDIT], 0 |
je .L20 |
cmp [glb_MOVED], 2 |
jne .L522 |
cmp [esi + TREKDATA.JUSTIN], 0 |
jne .L522 |
call TAttack_Main |
.L522: |
mov [glb_MOVED], 1 |
jmp .L2500 |
.L600: |
call TShields_Main |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.IDIDIT], 0 |
je .L20 |
call TAttack_Main |
mcLoadGameDataPtr esi |
mov [esi + TREKDATA.SHLDCHG], 0 |
jmp .L320 |
.L700: |
call TDock_Main |
jmp .L305 |
.L800: |
call TDock_DamageReport |
jmp .L20 |
.L900: |
call TChart_Main |
jmp .L20 |
.L1000: |
cmp [glb_MOVED], 0 |
jne .L505 |
call TImpulse_Main |
jmp .L520 |
.L1100: |
call TGame_Wait |
jmp .L410 |
.L1200: |
call TChart_SetWarp |
jmp .L20 |
.L1300: |
call TSrScan_Status |
jmp .L20 |
.L1400: |
call TPlanet_Sensor |
.skip_before_prompt: |
call TConsole_ScrollUp |
jmp .L20 |
.L1450: |
call TPlanet_Orbit |
jmp .L410 |
.L1500: |
call TPlanet_Beam |
jmp .L20 |
.L1550: |
call TPlanet_Mine |
jmp .L410 |
.L1600: |
call TPlanet_Crystal |
jmp .L20 |
.L1650: |
call TPlanet_Galileo |
jmp .L410 |
.L1670: |
call TPlanet_Main |
jmp .skip_before_prompt |
.L1680: |
call TSrScan_Request |
jmp .L20 |
.L1685: |
inc [glb_bEmExit] |
call TGame_Freeze |
jmp .quit_now_fast |
.L1690: |
mcLoadGameDataPtr edi |
mov [edi + TREKDATA.IDIDIT], 0 |
call TGame_Report |
jmp .L20 |
; |
; Non-abbreviated commands (executing) |
; |
.L1700: |
mov cl, 21 |
call TCmdBuf_VerifyToken |
jnc .L20 |
call TDock_Help |
jmp .L20 |
.L9000: |
mov cl, 33 |
call TCmdBuf_VerifyToken |
jnc .L20 |
jmp .L9001 |
.L1900: |
mov cl, 25 |
call TCmdBuf_VerifyToken |
jnc .L20 |
call TDock_Abandon |
jmp .L20 |
.L2000: |
mov cl, 29 |
call TCmdBuf_VerifyToken |
jnc .L20 |
call TApp_SelfDestruct |
jmp .L20 |
.L2100: |
mov cl, 35 |
call TCmdBuf_VerifyToken |
jnc .L20 |
call TGame_Freeze |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.IDIDIT], 1 |
je .L9999 |
jmp .L20 |
.L2200: |
mov cl, 44 |
call TCmdBuf_VerifyToken |
jnc .L20 |
call TPlanet_DeathRay |
jmp .L305 |
.L2300: |
mov ecx, 708 |
call TCmdBuf_VerifyToken_ECX |
jnc .L20 |
call TLrScan_Log |
jmp .L20 |
.L2500: |
; |
; After command which may use time invoke events module |
; |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .L9999 |
fld [esi + TREKDATA.TIME] |
fldz |
mc_CMP_ST0_ST1 |
jz .L2501 |
call TEvents_Main |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .L9999 |
.L2501: |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
jne .L2510 |
mov al, 16 |
mcZeroBits ecx |
call TNova_AutomaticOverride |
mcZeroBits eax |
mov [glb_MOVED], al |
jmp .L2500 |
.L2510: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.NENHERE], 0 |
jne .L2511 |
call TEvents_MoveTholian |
.L2511: |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.KDIDIT], 1 |
je .L15 |
cmp [esi + TREKDATA.NENHERE], 0 |
je .L15 |
cmp [glb_MOVED], 0 |
je .L310 |
cmp [esi + TREKDATA.JUSTIN], 1 |
je .L310 |
jmp .L20 |
.L9001: |
call TGame_Score |
.L9999: |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
call TPlanet_Stars |
call TConsole_ScrollUp |
mov ecx, 474 |
call TGame_JA |
jnc .end_game |
mov cl, 40 |
call TConsole_Skip |
jmp .L10 |
.end_game: |
call TConsole_ScrollUp |
mov ecx, 475 |
call TConsole_ProutGameMsg |
mov ecx, 476 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 653 |
call TGame_Prompt |
.quit_now_fast: |
invoke PostMessage, [glb_MainWnd], WM_CLOSE, 0, 0 |
mcEpilog |
ret 4 |
; --- EOF --- |
/programs/games/StarTrek/trunk/TImpulse.Asm |
---|
0,0 → 1,158 |
; -------------------------------------------------------------------------- |
; FILE: TImpulse.Asm |
; DATE: November 9, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; IMPULSE |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc50: |
.pTrekData PVOID ? |
.dbl_POWER DOUBLE ? |
.__padded__ BYTES 2 |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TImpulse_Main: |
mcBeginLocals loc50.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc50.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
mov cl, DEV_IMPULSE_ENGINES |
call TArray_IsDamaged |
jc .L40 |
fld [glb_dbl_30] |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L5 |
jz .L5 |
call TMove_GetCourseDistance |
mcLoadLocal esi, loc50.pTrekData |
fldz |
fld [esi + TREKDATA.DIREC] |
mc_CMP_ST0_ST1 |
jc .done |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_100] |
fmulp |
fld [glb_dbl_20] |
faddp |
fstp [esp + loc50.dbl_POWER] |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc50.dbl_POWER] |
mc_CMP_ST0_ST1 |
jc .L20 |
.L5: |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 576 |
call TConsole_Prout |
mov ecx, 577 |
call TConsole_Prout |
mcLoadLocal esi, loc50.pTrekData |
fld [glb_dbl_30] |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jnc .L10 |
mov ecx, 578 |
call TConsole_Prout |
jmp .done |
.L10: |
mov ecx, 579 |
call TConsole_Prout |
mcLoadLocal esi, loc50.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_20] |
fsubp |
fld [glb_dbl_0dot01] |
fmulp |
fld [glb_dbl_0dot05] |
fsubp |
mov cl, 1 |
call TConsole_CramFloat |
mov ecx, 580 |
call TConsole_Prout |
jmp .done |
.L20: |
mcLoadLocal esi, loc50.pTrekData |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_0dot095] |
fdivp |
fstp [esi + TREKDATA.TIME] |
fld [esi + TREKDATA.REMTIME] |
fld [esi + TREKDATA.TIME] |
mc_CMP_ST0_ST1 |
jc .L30 |
call TConsole_SetCrewMsgAttr |
mov ecx, 581 |
call TConsole_Prout |
mov ecx, 582 |
call TConsole_Prout |
mov ecx, 583 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 158 |
call TGame_JA |
jnc .done |
.L30: |
call TMove_Move |
mcLoadLocal esi, loc50.pTrekData |
inc [esi + TREKDATA.IDIDIT] |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_100] |
fmulp |
fld [glb_dbl_20] |
faddp |
fld [esi + TREKDATA.ENERGY] |
fsubrp |
fstp [esi + TREKDATA.ENERGY] |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_0dot095] |
fdivp |
fstp [esi + TREKDATA.TIME] |
fld [esi + TREKDATA.ENERGY] |
fldz |
mc_CMP_ST0_ST1 |
jc .done |
mov al, 4 |
call TFinish_Main |
jmp .done |
.L40: |
call TConsole_ScrollUp |
mov ecx, 584 |
call TConsole_ProutGameMsg |
.done: |
mcEndLocals loc50.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TLog.Asm |
---|
0,0 → 1,143 |
; -------------------------------------------------------------------------- |
; FILE: TLog.Asm |
; DATE: February 21, 2009 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_Create: |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TLog.size |
mov [glb_pLog], eax |
mov edi, eax |
mcZeroBits eax |
mov [edi + TLog.nRemainChars], eax |
mov [edi + TLog.nStoredChars], eax |
mov [edi + TLog.pCurrentBufPos], eax |
invoke VirtualAlloc, 0, MAX_LOG_ROOM, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE |
mov [edi + TLog.pBuffer], eax |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_Enable: |
invoke CreateFile, str_LogFileName, GENERIC_WRITE, \ |
0, 0, CREATE_ALWAYS, FILE_FLAG_SEQ_SCAN, 0 |
invoke CloseHandle, eax |
mov edi, [glb_pLog] |
mcZeroBits eax |
mov edx, MAX_LOG_ROOM |
mov ebx, [edi + TLog.pBuffer] |
mov [edi + TLog.nRemainChars], edx |
mov [edi + TLog.nStoredChars], eax |
mov [edi + TLog.pCurrentBufPos], ebx |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_Backspace: |
cmp [glb_LogEnabled], 1 |
je .do_it |
ret |
.do_it: |
mov esi, [glb_pLog] |
cmp [esi + TLog.nStoredChars], 0 |
je .print_backspace |
dec [esi + TLog.nStoredChars] |
dec [esi + TLog.pCurrentBufPos] |
inc [esi + TLog.nRemainChars] |
ret |
.print_backspace: |
mov al, '\' |
call TLog_DumpChar |
mov al, 'B' |
call TLog_DumpChar |
mov al, 'S' |
call TLog_DumpChar |
mov al, 'P' |
call TLog_DumpChar |
mov al, '\' |
call TLog_DumpChar |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_Disable: |
cmp [glb_LogEnabled], 1 |
je .do_it |
ret |
.do_it: |
call TLog_Flush |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_Flush: |
mov esi, [glb_pLog] |
mov ecx, [esi + TLog.nStoredChars] |
jecxz .done |
invoke CreateFile, str_LogFileName, GENERIC_WRITE, \ |
0, 0, OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0 |
mov ebx, eax |
invoke SetFilePointer, eax, 0, 0, 2 |
invoke WriteFile, ebx, [esi + TLog.pBuffer], [esi + TLog.nStoredChars], glb_FPU_Int32, 0 |
invoke CloseHandle, ebx |
mcZeroBits eax |
mov edx, MAX_LOG_ROOM |
mov ebx, [esi + TLog.pBuffer] |
mov [esi + TLog.nRemainChars], edx |
mov [esi + TLog.nStoredChars], eax |
mov [esi + TLog.pCurrentBufPos], ebx |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; AL = character to append into log buffer. |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLog_DumpChar: |
cmp [glb_LogEnabled], 1 |
je .do_it |
ret |
.do_it: |
mcOnRegZero al, .do_backspace |
mov esi, [glb_pLog] |
cmp [esi + TLog.nRemainChars], 0 |
jne .dump |
push eax |
call TLog_Flush |
pop eax |
mov esi, [glb_pLog] |
.dump: |
mov edi, [esi + TLog.pCurrentBufPos] |
stosb |
mov [esi + TLog.pCurrentBufPos], edi |
inc [esi + TLog.nStoredChars] |
dec [esi + TLog.nRemainChars] |
ret |
.do_backspace: |
call TLog_Backspace |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TLog.Inc |
---|
0,0 → 1,28 |
; -------------------------------------------------------------------------- |
; FILE: TLog.Inc |
; DATE: February 21, 2009 |
; -------------------------------------------------------------------------- |
MAX_LOG_ROOM = 40000h |
; -------------------------------------------------------------------------- |
PLAQUE_INSERT_KLRATE = 0F8h |
PLAQUE_INSERT_SCORE = 0F9h |
PLAQUE_INSERT_DATE = 0FAh |
PLAQUE_INSERT_LEVEL = 0FBh |
PLAQUE_INSERT_NAME = 0FCh |
PLAQUE_STRING = 0FDh |
PLAQUE_END_OF_LINE = 0FEh |
PLAQUE_END_OF_ALL = 0FFh |
; -------------------------------------------------------------------------- |
virtual at 0 |
TLog: |
.pBuffer PCHAR ? |
.pCurrentBufPos PCHAR ? |
.nStoredChars COUNT ? |
.nRemainChars COUNT ? |
.size = $ |
end virtual |
; --- EOF --- |
/programs/games/StarTrek/trunk/TLrScan.Asm |
---|
0,0 → 1,184 |
; -------------------------------------------------------------------------- |
; FILE: TLrScan.Asm |
; DATE: October 11, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Enable/Disable log file |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLrScan_Log: |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
je .check_yes_no |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .print_log_state |
.print_log_format: |
mov ecx, 712 |
.print: |
call TConsole_ProutGameMsg |
ret |
.check_yes_no: |
mcLoad8bitsToReg32 ecx, 159 |
call TCmdBuf_Crop |
jc .yes |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .print_log_format |
; |
; Switch logging OFF |
; |
cmp [glb_LogEnabled], 0 |
je .msg710 |
call TLog_Disable |
mov [glb_LogEnabled], 0 |
.msg710: |
mov ecx, 710 |
jmp .print |
.yes: |
; |
; Switch logging ON |
; |
cmp [glb_LogEnabled], 1 |
je .msg711 |
mov [glb_LogEnabled], 1 |
call TLog_Enable |
.msg711: |
mov ecx, 711 |
jmp .print |
.print_log_state: |
movzx ecx, [glb_LogEnabled] |
add ecx, 710 |
jmp .print |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = X quadrant coordinate (may be out of range) |
; EDX = Y quadrant coordinate (may be out of range) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLrScan_DumpContents: |
push eax edx |
cmp eax, 1 |
jb .out_of_range |
cmp edx, 1 |
jb .out_of_range |
cmp eax, 8 |
ja .out_of_range |
cmp edx, 8 |
ja .out_of_range |
mcLoad1 ecx |
call TArray_SetStarChartValue |
mov cl, ATTR_REPORT_VALUE |
call TConsole_SetAttr |
call TArray_GetGalaxyValue |
mov eax, ecx |
mov cl, 5 |
call TConsole_CramIntWidth |
jmp .done |
.out_of_range: |
mov cl, ATTR_GALAXY_EDGE |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 134 |
call TConsole_Cram |
.done: |
pop edx eax |
ret |
; -------------------------------------------------------------------------- |
; LRSCAN |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TLrScan_Main: |
mov cl, DEV_LR_SENSORS |
call TArray_IsDamaged |
jnc .proceed |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .not_available |
.proceed: |
call TConsole_ScrollUp |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 135 |
call TConsole_Cram |
mov cl, 1 |
mcLoadGameDataPtr ebx |
mov al, [ebx + TREKDATA.QUADX] |
mov dl, [ebx + TREKDATA.QUADY] |
call TConsole_CramLoc |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
; |
; EAX = QUADX-1 |
; EDX = QUADY-1 |
; |
mcLoadGameDataPtr ebx |
movzx eax, [ebx + TREKDATA.QUADX] |
movzx edx, [ebx + TREKDATA.QUADY] |
dec eax |
dec edx |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
push edx eax |
call TConsole_ScrollUp |
pop eax edx |
inc eax |
sub edx, 2 |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
push edx eax |
call TConsole_ScrollUp |
pop eax edx |
inc eax |
sub edx, 2 |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
inc edx |
call TLrScan_DumpContents |
call TConsole_ScrollUp |
jmp .done |
.not_available: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 133 |
call TConsole_Prout |
.done: |
call TConsole_ScrollUp |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TMove.Asm |
---|
0,0 → 1,1786 |
; -------------------------------------------------------------------------- |
; FILE: TMove.Asm |
; DATE: October 12, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; TIMEWRP |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc56: |
.pTrekData PVOID ? |
.dbl_XDATE DOUBLE ? |
._pad_1 BYTE ? |
._pad_2 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_TimeWarp: |
mcBeginLocals loc56.size |
mov ecx, 627 |
call TConsole_ProutGameMsg |
mcLoadGameDataPtr esi |
mcStoreLocal loc56.pTrekData, esi |
mov ebx, [glb_pCommon] |
cmp [ebx + TCommon.SNAP], 0 |
je .travel_forward |
fld [glb_dbl_0dot5] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L10 |
.travel_forward: |
mcLoadLocal esi, loc56.pTrekData |
fld [esi + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fstp [esi + TREKDATA.TIME] |
mov ecx, 628 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal esi, loc56.pTrekData |
fld [esi + TREKDATA.TIME] |
call TConsole_CramFloat |
mov ecx, 630 |
call TConsole_Prout |
mcLoadLocal esi, loc56.pTrekData |
fld [esi + TREKDATA.FUTURE2] |
fld [glb_dbl_1E38] |
mc_CMP_ST0_ST1 |
jz .L40 |
fld [esi + TREKDATA.FUTURE2] |
fld [esi + TREKDATA.TIME] |
faddp |
fstp [esi + TREKDATA.FUTURE2] |
jmp .L40 |
.L10: |
mcLoadLocal esi, loc56.pTrekData |
fld [esi + TREKDATA.DATE] |
fstp [esp + loc56.dbl_XDATE] |
mov ebx, [glb_pCommon] |
mov [ebx + TCommon.SNAP], 0 |
mcLoadMemberRef esi, TCommon.SNAPSHT |
mcLoadMemberRef edi, TCommon.GAMEDB |
mov ecx, TREKDATA.size |
rep movsb |
mov ecx, 629 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal esi, loc56.pTrekData |
fld [esp + loc56.dbl_XDATE] |
fld [esi + TREKDATA.DATE] |
fsubp |
call TConsole_CramFloat |
mov ecx, 630 |
call TConsole_Prout |
mcLoadLocal esi, loc56.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
je .L25 |
mcLoadLocal ebx, loc56.pTrekData |
fld [ebx + TREKDATA.INTIME] |
movzx eax, [ebx + TREKDATA.REMCOM] |
call TCommon_FPU_Load_EAX |
fdivp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE2] |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot3] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE4] |
.L25: |
mcLoadLocal ebx, loc56.pTrekData |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE1] |
fld [ebx + TREKDATA.INTIME] |
fld [glb_dbl_0dot5] |
fmulp |
call TCommon_ExpRan |
fld [ebx + TREKDATA.DATE] |
faddp |
fstp [ebx + TREKDATA.FUTURE3] |
cmp [ebx + TREKDATA.NSCREM], 0 |
je .set_scom_features |
fld [glb_dbl_0dot2777] |
fstp [ebx + TREKDATA.FUTURE6] |
.set_scom_features: |
mcZeroBits eax |
mcStoreMember TREKDATA.BATX, al |
mcStoreMember TREKDATA.BATY, al |
mcStoreMember TREKDATA.ISATB, al |
fld [glb_dbl_1E38] |
fld st |
fstp [ebx + TREKDATA.FUTURE5] |
fstp [ebx + TREKDATA.FUTURE7] |
; |
; Revert star chart to earlier era |
; |
mcLoadMemberRef esi, TREKDATA.STARCH |
mcLoad8bitsToReg32 ecx, 64 |
.revert: |
cmp dword [esi], 1 |
jle .next_revert |
mov dword [esi], 1 |
.next_revert: |
add esi, 4 |
loop .revert |
mov ecx, 631 |
call TConsole_ProutGameMsg |
.L40: |
call TCommon_NewQuad |
.done: |
mcEndLocals loc56.size |
ret |
; -------------------------------------------------------------------------- |
; RAM |
; -------------------------------------------------------------------------- |
; Input: |
; AL = IX sector of a collision |
; DL = IY sector of a collision |
; CL = IENM (object type symbol) |
; BL = IBUMPD (who rammed what) |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc43: |
.pTrekData PVOID ? |
.dbl_TYPE DOUBLE ? |
.dbl_EXTRADM DOUBLE ? |
.chIENM CHAR ? |
.sect_IX BYTE ? |
.sect_IY BYTE ? |
.bIBUMPED BYTE ? |
.nICAS COUNT ? |
.nL INDEX ? |
.pDAMAGE PDOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_Ram: |
mcBeginLocals loc43.size |
mcStoreLocal loc43.bIBUMPED, bl |
mcStoreLocal loc43.sect_IX, al |
mcStoreLocal loc43.sect_IY, dl |
mcStoreLocal loc43.chIENM, cl |
mcLoadGameDataPtr ebx |
mcStoreLocal loc43.pTrekData, ebx |
mcLoadMemberRef esi, TREKDATA.DAMAGE |
mcStoreLocal loc43.pDAMAGE, esi |
call TMove_RedAlert |
call TConsole_SetGameMsgAttr |
mov ecx, 334 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
movzx eax, [esp + loc43.bIBUMPED] |
lea ecx, [eax + 335] |
call TConsole_Cram |
mcLoadLocal al, loc43.chIENM |
mcOnRegEqu al, CHAR_KLINGON, .klingon |
mcOnRegEqu al, CHAR_THOLIAN, .tholian |
mcOnRegEqu al, CHAR_ROMULAN, .romulan |
mcOnRegEqu al, CHAR_COMMANDER, .commander |
mcOnRegEqu al, CHAR_SCOM, .scommander |
;int 3 |
jmp .done |
.klingon: |
push 2 |
jmp .calc_type |
.tholian: |
push 1 |
jmp .calc_type |
.romulan: |
push 3 |
jmp .calc_type |
.commander: |
push 4 |
jmp .calc_type |
.scommander: |
push 5 |
.calc_type: |
pop ecx |
fldz |
.L11: |
fld [glb_dbl_0dot5] |
faddp |
loop .L11 |
fstp [esp + loc43.dbl_TYPE] |
mov cl, 2 |
mcLoadLocal bl, loc43.chIENM |
mcLoadLocal al, loc43.sect_IX |
mcLoadLocal dl, loc43.sect_IY |
call TConsole_CramEnemyAt |
call TConsole_ScrollUp |
mcLoadLocal al, loc43.sect_IX |
mcLoadLocal dl, loc43.sect_IY |
call TPhasers_DeadKlingon |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
mov ecx, 337 |
call TConsole_Prout |
mov ecx, 338 |
call TConsole_Cram |
call TRandom_Ranf |
fld [glb_dbl_20] |
fmulp |
call TCommon_FP_Truncate |
add eax, 10 |
mcStoreLocal loc43.nICAS, eax |
call TConsole_CramInt |
mov ecx, 339 |
call TConsole_Prout |
mcLoadLocal esi, loc43.pTrekData |
mcLoadLocal eax, loc43.nICAS |
add [esi + TREKDATA.CASUAL], al |
mcLoad1 ecx |
mcStoreLocal loc43.nL, ecx |
.damage_device: |
mcLoadLocal esi, loc43.pDAMAGE |
fldz |
fld tbyte [esi] |
mc_CMP_ST0_ST1 |
jc .L10 |
call TRandom_Ranf |
fld [esp + loc43.dbl_TYPE] |
fmulp |
fld [glb_dbl_Ten] |
fmulp |
fld1 |
faddp |
mcLoadLocal esi, loc43.pTrekData |
fld [esi + TREKDATA.DAMFAC] |
fmulp |
fld [esi + TREKDATA.TIME] |
faddp |
mcLoadLocal esi, loc43.pDAMAGE |
fld tbyte [esi] |
faddp |
fstp tbyte [esi] |
.L10: |
add [esp + loc43.pDAMAGE], 10 |
inc [esp + loc43.nL] |
cmp [esp + loc43.nL], 13 |
jbe .damage_device |
mcLoadLocal edi, loc43.pTrekData |
mov [edi + TREKDATA.ISUBDAM], 1 |
mov [edi + TREKDATA.SHLDUP], 0 |
cmp [edi + TREKDATA.REMKL], 0 |
je .finished |
call TDock_DamageReport |
jmp .done |
.finished: |
mov al, 1 |
call TFinish_Main |
.done: |
mcEndLocals loc43.size |
ret |
; -------------------------------------------------------------------------- |
; BEGPARD |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_BegPardon: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 173 |
call TConsole_Prout |
ret |
; -------------------------------------------------------------------------- |
; GETCD |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc28: |
.pTrekData PVOID ? |
.nIROWQ INT32 ? |
.nIROWS INT32 ? |
.nICOLQ INT32 ? |
.nICOLS INT32 ? |
.nITEMP INT32 ? |
.nIPROMPT INT32 ? |
.nXJ INT32 ? |
.nXK INT32 ? |
.nXL INT32 ? |
.nXI INT32 ? |
.dbl_DELTX DOUBLE ? |
.dbl_DELTY DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_GetCourseDistance: |
mcBeginLocals loc28.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc28.pTrekData, esi |
cmp [esi + TREKDATA.LANDED], 1 |
jne .L1 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 163 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 164 |
call TConsole_Cram |
call TConsole_CramShip |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
jmp .L71 |
.L1: |
movzx eax, [esi + TREKDATA.QUADX] |
movzx edx, [esi + TREKDATA.QUADY] |
mcStoreLocal loc28.nIROWQ, eax |
mcStoreLocal loc28.nICOLQ, edx |
fldz |
fldz |
fstp [esp + loc28.dbl_DELTX] |
fstp [esp + loc28.dbl_DELTY] |
mcZeroBits ecx |
mcStoreLocal loc28.nITEMP, ecx |
mcStoreLocal loc28.nIPROMPT, ecx |
.L10: |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L24 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
je .L13 |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
jc .L1301 |
.L11: |
mcLoad8bitsToReg32 ecx, 174 |
call TGame_Prompt |
inc [esp + loc28.nIPROMPT] |
jmp .L10 |
.L13: |
mcLoad8bitsToReg32 ecx, 165 |
call TCmdBuf_Crop |
jc .L20 |
mcLoad8bitsToReg32 ecx, 166 |
call TCmdBuf_Crop |
jnc .L11 |
; |
; Automatic movement requested. |
; Check for computer damage. |
; |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
jnc .L14 |
.L1301: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 167 |
call TConsole_Prout |
jmp .L2001 |
.L14: |
; |
; Get quadrant and sector |
; |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc28.nXI, eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L15 |
.L1410: |
mcLoad8bitsToReg32 ecx, 168 |
call TGame_Prompt |
inc [esp + loc28.nIPROMPT] |
jmp .L14 |
.L15: |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L1410 |
cmp [ebx + TCmdBuf.cmdbuf_INUM], -1 |
je .L71 |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc28.nXJ, eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L1410 |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc28.nXK, eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L16 |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc28.nXL, eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L1410 |
; |
; Quadrant and sector specified |
; |
mcLoadLocal eax, loc28.nXI |
mcLoadLocal edx, loc28.nXJ |
mcStoreLocal loc28.nIROWQ, eax |
mcStoreLocal loc28.nICOLQ, edx |
mcLoadLocal eax, loc28.nXK |
mcLoadLocal edx, loc28.nXL |
mcStoreLocal loc28.nIROWS, eax |
mcStoreLocal loc28.nICOLS, edx |
jmp .L30 |
.L16: |
; |
; Only sector specified |
; |
mcLoadLocal eax, loc28.nXI |
mcLoadLocal edx, loc28.nXJ |
mcStoreLocal loc28.nIROWS, eax |
mcStoreLocal loc28.nICOLS, edx |
inc [esp + loc28.nITEMP] |
jmp .L30 |
.L20: |
; |
; Manual (DELTX,DELTY) movement |
; |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L24 |
.L2001: |
mcLoad8bitsToReg32 ecx, 169 |
call TGame_Prompt |
inc [esp + loc28.nIPROMPT] |
jmp .L20 |
.L24: |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc28.dbl_DELTX] |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L29 |
; |
; if (deltx == -1.0) && (key == EOL) goto 71 |
; |
fld [esp + loc28.dbl_DELTX] |
fld1 |
fchs |
mc_CMP_ST0_ST1 |
jz .L71 |
.L29: |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L70 |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc28.dbl_DELTY] |
jmp .L40 |
.L30: |
; |
; Check for invalid input for automatic case |
; |
mcLoadLocal eax, loc28.nICOLQ |
mcLoadLocal edx, loc28.nIROWQ |
cmp eax, 1 |
jl .L70 |
cmp edx, 1 |
jl .L70 |
cmp eax, 8 |
jg .L70 |
cmp edx, 8 |
jg .L70 |
mcLoadLocal eax, loc28.nICOLS |
mcLoadLocal edx, loc28.nIROWS |
cmp eax, 1 |
jl .L70 |
cmp edx, 1 |
jl .L70 |
cmp eax, 10 |
jg .L70 |
cmp edx, 10 |
jg .L70 |
; |
; Print message from appropriate officer |
; |
cmp [esp + loc28.nITEMP], 0 |
jne .L31 |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 170 |
call TConsole_Prout |
jmp .L32 |
.L31: |
cmp [esp + loc28.nIPROMPT], 0 |
je .L32 |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 171 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal eax, loc28.nIROWS |
mcLoadLocal edx, loc28.nICOLS |
call TConsole_CramLoc |
mcLoad8bitsToReg32 ecx, 154 |
call TConsole_Prout |
.L32: |
; |
; Convert to DELTX,DELTY form |
; |
mcLoadLocal esi, loc28.pTrekData |
mcLoadLocal eax, loc28.nICOLS |
movzx edx, [esi + TREKDATA.SECTY] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
mcLoadLocal eax, loc28.nICOLQ |
movzx edx, [esi + TREKDATA.QUADY] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
faddp |
fstp [esp + loc28.dbl_DELTX] |
mcLoadLocal edx, loc28.nIROWS |
movzx eax, [esi + TREKDATA.SECTX] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
mcLoadLocal edx, loc28.nIROWQ |
movzx eax, [esi + TREKDATA.QUADX] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
faddp |
fstp [esp + loc28.dbl_DELTY] |
.L40: |
; |
; Check for a zero movement |
; |
fld [esp + loc28.dbl_DELTX] |
fldz |
mc_CMP_ST0_ST1 |
jnz .L42 |
fld [esp + loc28.dbl_DELTY] |
fldz |
mc_CMP_ST0_ST1 |
jz .L71 |
.L42: |
cmp [esp + loc28.nIPROMPT], 0 |
je .L43 |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 172 |
call TConsole_Prout |
.L43: |
; |
; Convert into course and distance |
; |
fld [esp + loc28.dbl_DELTX] |
fld st |
fmulp |
fld [esp + loc28.dbl_DELTY] |
fld st |
fmulp |
faddp |
fsqrt |
mcLoadLocal edi, loc28.pTrekData |
fstp [edi + TREKDATA.DIST] |
fld [esp + loc28.dbl_DELTX] |
fld [esp + loc28.dbl_DELTY] |
fpatan |
fld [glb_dbl_1dot90985932] |
fmulp |
fstp [edi + TREKDATA.DIREC] |
fldz |
fld [edi + TREKDATA.DIREC] |
mc_CMP_ST0_ST1 |
jnc .done |
fld [edi + TREKDATA.DIREC] |
fld [glb_dbl_12] |
faddp |
fstp [edi + TREKDATA.DIREC] |
jmp .done |
.L70: |
call TConsole_ScrollUp |
call TMove_BegPardon |
.L71: |
fld1 |
fchs |
mcLoadLocal edi, loc28.pTrekData |
fstp [edi + TREKDATA.DIREC] |
.done: |
mcEndLocals loc28.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = X sector |
; EDX = Y sector |
; Output: |
; ST(0) = distance |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_DistanceAfterMove: |
mcLoadGameDataPtr ebx |
movzx ecx, [ebx + TREKDATA.SECTX] |
sub eax, ecx |
movzx ecx, [ebx + TREKDATA.SECTY] |
sub edx, ecx |
imul edx, edx |
imul eax, eax |
add eax, edx |
call TCommon_FPU_Load_EAX |
fsqrt |
fld [glb_dbl_0dot1] |
fmulp |
ret |
; -------------------------------------------------------------------------- |
; REDALRT |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_RedAlert: |
mov cl, ATTR_COND_RED |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 180 |
call TConsole_Prout |
ret |
; -------------------------------------------------------------------------- |
; MOVE |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc29: |
.pTrekData PVOID ? |
.bTRBEAM BOOL ? |
.bXTIMEW BOOL ? |
.dbl_DeltaX DOUBLE ? |
.dbl_DeltaY DOUBLE ? |
.dbl_Angle DOUBLE ? |
.dbl_Bigger DOUBLE ? |
.dbl_X DOUBLE ? |
.dbl_Y DOUBLE ? |
.dbl_Stopegy DOUBLE ? |
.dbl_align DOUBLE ? |
.nIX INT32 ? |
.nIY INT32 ? |
.nSteps INT32 ? |
.iStep INT32 ? |
.nIQUAD BYTE ? |
.nKINKS BYTE ? |
.nKINK BYTE ? |
.nReserved3 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_Move: |
mcBeginLocals loc29.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc29.pTrekData, esi |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .check_if_leaving_orbit |
mov [esi + TREKDATA.CONDIT], CONDITION_GREEN |
call TCommon_NewCondition |
.check_if_leaving_orbit: |
cmp [esi + TREKDATA.INORBIT], 0 |
je .L1 |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 175 |
call TConsole_Prout |
mcLoadLocal esi, loc29.pTrekData |
mov [esi + TREKDATA.INORBIT], 0 |
.L1: |
fld [glb_dbl_15] |
fld [esi + TREKDATA.DIREC] |
fsubp |
fld [glb_dbl_0dot5235998] |
fmulp |
fstp [esp + loc29.dbl_Angle] |
; |
; DELTAX = -SIN (ANGLE) |
; |
fld [esp + loc29.dbl_Angle] |
fsin |
fchs |
fstp [esp + loc29.dbl_DeltaX] |
; |
; DELTAY = COS (ANGLE) |
; |
fld [esp + loc29.dbl_Angle] |
fcos |
fstp [esp + loc29.dbl_DeltaY] |
fld [esp + loc29.dbl_DeltaX] |
fld [esp + loc29.dbl_DeltaY] |
call TMove_Bigger |
fstp [esp + loc29.dbl_Bigger] |
fld [esp + loc29.dbl_DeltaX] |
fld [esp + loc29.dbl_Bigger] |
fdivp |
fstp [esp + loc29.dbl_DeltaX] |
fld [esp + loc29.dbl_DeltaY] |
fld [esp + loc29.dbl_Bigger] |
fdivp |
fstp [esp + loc29.dbl_DeltaY] |
mov [esp + loc29.bTRBEAM], 0 |
; |
; If tractor beam is to occur, do not |
; move full distance |
; |
fld [esi + TREKDATA.FUTURE2] |
fld [esi + TREKDATA.DATE] |
fld [esi + TREKDATA.TIME] |
faddp |
mc_CMP_ST0_ST1 |
jc .L5 |
; |
; Ship will be tractored! |
; |
inc [esp + loc29.bTRBEAM] |
mov [esi + TREKDATA.CONDIT], CONDITION_RED |
fld [esi + TREKDATA.FUTURE2] |
fld [esi + TREKDATA.DATE] |
fsubp |
fld [esi + TREKDATA.DIST] |
fmulp |
fld [esi + TREKDATA.TIME] |
fdivp |
fld [glb_dbl_0dot1] |
faddp |
fstp [esi + TREKDATA.DIST] |
fld [esi + TREKDATA.FUTURE2] |
fld [esi + TREKDATA.DATE] |
fsubp |
fld [glb_dbl_0dot00001] |
faddp |
fstp [esi + TREKDATA.TIME] |
.L5: |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
mov al, [esi + TREKDATA.SECTX] |
call TCommon_LoadByteIntoFPU |
fstp [esp + loc29.dbl_X] |
mov al, [esi + TREKDATA.SECTY] |
call TCommon_LoadByteIntoFPU |
fstp [esp + loc29.dbl_Y] |
; |
; How many steps to move |
; |
fld [esi + TREKDATA.DIST] |
fld [esp + loc29.dbl_Bigger] |
fmulp |
fld [glb_dbl_Ten] |
fmulp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc29.nSteps, eax |
mcOnRegZero eax, .L100 |
mcLoad1 ecx |
mcStoreLocal loc29.iStep, ecx |
.move_one_step: |
fld [esp + loc29.dbl_X] |
fld [esp + loc29.dbl_DeltaX] |
faddp |
fld st |
fstp [esp + loc29.dbl_X] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc29.nIX, eax |
fld [esp + loc29.dbl_Y] |
fld [esp + loc29.dbl_DeltaY] |
faddp |
fld st |
fstp [esp + loc29.dbl_Y] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc29.nIY, eax |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
cmp eax, 1 |
jl .L40 |
cmp edx, 1 |
jl .L40 |
cmp eax, 10 |
jg .L40 |
cmp edx, 10 |
jg .L40 |
call TArray_QuadPtr |
mov al, [ebx] |
mcStoreLocal loc29.nIQUAD, al |
cmp al, CHAR_COSMOS |
jne .L20 |
inc [esp + loc29.iStep] |
mov ecx, [esp + loc29.iStep] |
cmp ecx, [esp + loc29.nSteps] |
jbe .move_one_step |
; |
; Arrived into sector in the same quadrant |
; |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
call TMove_DistanceAfterMove |
mcLoadLocal edi, loc29.pTrekData |
fstp [edi + TREKDATA.DIST] |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
mov [edi + TREKDATA.SECTX], al |
mov [edi + TREKDATA.SECTY], dl |
jmp .L100 |
.L20: |
; |
; Object encountered along flight path |
; |
mcLoadLocal esi, loc29.pTrekData |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_50] |
fmulp |
fld [esi + TREKDATA.TIME] |
fdivp |
fstp [esp + loc29.dbl_Stopegy] |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
call TMove_DistanceAfterMove |
fstp [esi + TREKDATA.DIST] |
mcLoadLocal al, loc29.nIQUAD |
mcOnRegEqu al, CHAR_KLINGON, .L30 |
mcOnRegEqu al, CHAR_COMMANDER, .L30 |
mcOnRegEqu al, CHAR_SCOM, .L30 |
mcOnRegEqu al, CHAR_ROMULAN, .L30 |
mcOnRegEqu al, CHAR_THOLIAN, .L30 |
mcOnRegEqu al, CHAR_BLACK_HOLE, .L25 |
; |
; Ship is blocked by some object |
; |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
call TConsole_CramShip |
mcLoad8bitsToReg32 edx, 177 |
mcLoad8bitsToReg32 ecx, 176 |
cmp [esp + loc29.nIQUAD], CHAR_WEB |
cmove ecx, edx |
call TConsole_Cram |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
mov cl, 2 |
call TConsole_CramLoc |
mov al, ';' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 178 |
call TConsole_Cram |
mov cl, 2 |
fld [esp + loc29.dbl_Stopegy] |
call TConsole_CramFloat |
mcLoad8bitsToReg32 ecx, 179 |
call TConsole_Prout |
; |
; Deplete energy due to emergency stop |
; |
mcLoadLocal esi, loc29.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc29.dbl_Stopegy] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
fld [esp + loc29.dbl_X] |
fld [esp + loc29.dbl_DeltaX] |
fsubp |
call TCommon_FP_Truncate |
mov [esi + TREKDATA.SECTX], al |
fld [esp + loc29.dbl_Y] |
fld [esp + loc29.dbl_DeltaY] |
fsubp |
call TCommon_FP_Truncate |
mov [esi + TREKDATA.SECTY], al |
; |
; Check if emergency stop depleted all remaining energy |
; |
fld [esi + TREKDATA.ENERGY] |
fldz |
mc_CMP_ST0_ST1 |
jc .L100 |
mov al, 4 |
call TFinish_Main |
jmp .done |
.L25: |
; |
; Object is a black hole! Swallow ship. |
; |
call TMove_RedAlert |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
mcLoad8bitsToReg32 ecx, 182 |
call TConsole_Cram |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
mov cl, 2 |
call TConsole_CramLoc |
call TConsole_ScrollUp |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
mc_CMP_ST0_ST1 |
jc .L27 |
; |
; Ship warped into another quadrant |
; by a black hole. |
; |
call TRandom_IRan8 |
mcLoadLocal ebx, loc29.pTrekData |
mcStoreMember TREKDATA.QUADX, al |
mcStoreMember TREKDATA.QUADY, dl |
call TRandom_IRan10 |
mcLoadLocal ebx, loc29.pTrekData |
mcStoreMember TREKDATA.SECTX, al |
mcStoreMember TREKDATA.SECTY, dl |
call TRandom_Ranf |
fld [glb_dbl_0dot65] |
mcZeroBits ecx |
mc_CMP_ST0_ST1 |
setc cl |
mcStoreLocal loc29.bXTIMEW, ecx |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 183 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 184 |
call TConsole_Cram |
cmp [esp + loc29.bXTIMEW], 0 |
je .engage_time_warp |
mcLoad8bitsToReg32 ecx, 185 |
call TConsole_Cram |
.engage_time_warp: |
mcLoad8bitsToReg32 ecx, 186 |
call TConsole_Prout |
cmp [esp + loc29.bXTIMEW], 0 |
je .L95 |
call TMove_TimeWarp |
mcLoadLocal edi, loc29.pTrekData |
mov [edi + TREKDATA.KSTUF4], 1 |
jmp .L95 |
.L27: |
mov al, 21 |
call TFinish_Main |
jmp .done |
.L30: |
; |
; Object is an enemy vessel. Ram him! |
; |
mcLoadLocal eax, loc29.nIX |
mcLoadLocal edx, loc29.nIY |
mcLoadLocal ebx, loc29.pTrekData |
mcStoreMember TREKDATA.SECTX, al |
mcStoreMember TREKDATA.SECTY, dl |
mcLoadLocal cl, loc29.nIQUAD |
mcZeroBits ebx |
call TMove_Ram |
jmp .L100 |
.L40: |
; |
; Compute final position -- new quadrant and sector |
; |
mcLoadLocal esi, loc29.pTrekData |
movzx eax, [esi + TREKDATA.QUADX] |
movzx ecx, [esi + TREKDATA.SECTX] |
dec eax |
imul eax, 10 |
add eax, ecx |
mcStoreLocal loc29.nIX, eax |
movzx eax, [esi + TREKDATA.QUADY] |
movzx ecx, [esi + TREKDATA.SECTY] |
dec eax |
imul eax, 10 |
add eax, ecx |
mcStoreLocal loc29.nIY, eax |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esp + loc29.dbl_Bigger] |
fmulp |
fld [esp + loc29.dbl_DeltaX] |
fmulp |
frndint |
call TCommon_FP_Truncate |
add [esp + loc29.nIX], eax |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esp + loc29.dbl_Bigger] |
fmulp |
fld [esp + loc29.dbl_DeltaY] |
fmulp |
frndint |
call TCommon_FP_Truncate |
add [esp + loc29.nIY], eax |
; |
; Check for edge of the galaxy |
; |
mcZeroBits ecx |
mcStoreLocal loc29.nKINKS, cl |
.L45: |
mcZeroBits ecx |
mcStoreLocal loc29.nKINK, cl |
cmp [esp + loc29.nIX], 0 |
jg .L50 |
neg [esp + loc29.nIX] |
inc [esp + loc29.nIX] |
inc [esp + loc29.nKINK] |
.L50: |
cmp [esp + loc29.nIY], 0 |
jg .L55 |
neg [esp + loc29.nIY] |
inc [esp + loc29.nIY] |
inc [esp + loc29.nKINK] |
.L55: |
cmp [esp + loc29.nIX], 80 |
jle .L60 |
mcLoad8bitsToReg32 eax, 161 |
sub eax, [esp + loc29.nIX] |
mcStoreLocal loc29.nIX, eax |
inc [esp + loc29.nKINK] |
.L60: |
cmp [esp + loc29.nIY], 80 |
jle .L65 |
mcLoad8bitsToReg32 eax, 161 |
sub eax, [esp + loc29.nIY] |
mcStoreLocal loc29.nIY, eax |
inc [esp + loc29.nKINK] |
.L65: |
cmp [esp + loc29.nKINK], 0 |
je .L70 |
inc [esp + loc29.nKINKS] |
jmp .L45 |
.L70: |
cmp [esp + loc29.nKINKS], 0 |
je .L90 |
mcLoadLocal esi, loc29.pTrekData |
inc [esi + TREKDATA.NKINKS] |
cmp [esi + TREKDATA.NKINKS], 3 |
je .L80 |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 187 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 188 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 189 |
call TConsole_Prout |
jmp .L90 |
.L80: |
mov al, 6 |
call TFinish_Main |
jmp .done |
.L90: |
; |
; Compute final position of starship |
; in new quadrant. |
; |
mcLoadLocal eax, loc29.nIX |
add eax, 9 |
mcLoad8bitsToReg32 ecx, 10 |
mcZeroBits edx |
div ecx |
mcLoadLocal ebx, loc29.pTrekData |
mcStoreMember TREKDATA.QUADX, al |
mcLoadLocal eax, loc29.nIY |
add eax, 9 |
mcZeroBits edx |
div ecx |
mcStoreMember TREKDATA.QUADY, al |
movzx ecx, [ebx + TREKDATA.QUADX] |
dec ecx |
imul ecx, 10 |
mcLoadLocal eax, loc29.nIX |
sub eax, ecx |
mcStoreMember TREKDATA.SECTX, al |
movzx ecx, [ebx + TREKDATA.QUADY] |
dec ecx |
imul ecx, 10 |
mcLoadLocal eax, loc29.nIY |
sub eax, ecx |
mcStoreMember TREKDATA.SECTY, al |
cmp [esp + loc29.bTRBEAM], 0 |
jne .done |
.L95: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 190 |
call TConsole_Cram |
mcLoadLocal ebx, loc29.pTrekData |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
mov cl, 1 |
call TConsole_CramLoc |
call TConsole_ScrollUp |
call TArray_SetShip |
call TCommon_NewQuad |
jmp .done |
.L100: |
call TArray_SetShip |
call TCommon_ResetDist |
call TCommon_SortKlingons |
.done: |
mcEndLocals loc29.size |
ret |
; -------------------------------------------------------------------------- |
; ST0 = MAX (ABS (ST0), ABS (ST1)) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_Bigger: |
fabs |
fxch |
fabs |
call TCommon_FPU_Max |
ret |
; -------------------------------------------------------------------------- |
; WARP |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc26: |
.pTrekData PVOID ? |
.dblPower DOUBLE ? |
.dblAngle DOUBLE ? |
.dblDeltaX DOUBLE ? |
.dblDeltaY DOUBLE ? |
.dblBigger DOUBLE ? |
.dbl_align DOUBLE ? |
.dblSectX DOUBLE ? |
.dblSectY DOUBLE ? |
.nIWarp INT32 ? |
.nSteps INT32 ? |
.iStep INT32 ? |
.iSectX INT32 ? |
.iSectY INT32 ? |
.Blooey BOOL ? |
.TWarp BOOL ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMove_Warp: |
mcBeginLocals loc26.size |
mcLoadGameDataPtr edi |
mcStoreLocal loc26.pTrekData, edi |
mov [edi + TREKDATA.IDIDIT], 0 |
mov cl, DEV_WARP_ENGINES |
call TArray_GetDblDamage |
fld [glb_dbl_Ten] |
mc_CMP_ST0_ST1 |
jc TMove_WarpX.L90 |
mov cl, DEV_WARP_ENGINES |
call TArray_IsDamaged |
jnc .L3 |
fld [glb_dbl_4] |
mcLoadLocal esi, loc26.pTrekData |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L3 |
jz .L3 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 146 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 147 |
call TConsole_Prout |
call TConsole_ScrollUp |
jmp TMove_WarpX.done |
.L3: |
call TMove_GetCourseDistance |
fldz |
mcLoadLocal esi, loc26.pTrekData |
fld [esi + TREKDATA.DIREC] |
mc_CMP_ST0_ST1 |
jc TMove_WarpX.done |
; |
; Check energy required to use warp engines |
; |
fld [esi + TREKDATA.WARPFAC] |
fld st |
fld st |
fmulp |
fmulp |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_0dot05] |
faddp |
fmulp |
movzx eax, [esi + TREKDATA.SHLDUP] |
inc eax |
call TCommon_FPU_Load_EAX |
fmulp |
fstp [esp + loc26.dblPower] |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc26.dblPower] |
mc_CMP_ST0_ST1 |
jc .L10 |
; |
; Not enough energy |
; |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 148 |
call TConsole_Prout |
mcLoadLocal esi, loc26.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L5 |
fld [esp + loc26.dblPower] |
fld [glb_dbl_0dot5] |
fmulp |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L5 |
mcLoad8bitsToReg32 ecx, 149 |
call TConsole_Prout |
jmp TMove_WarpX.done |
.L5: |
fld [esi + TREKDATA.ENERGY] |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_0dot05] |
faddp |
fdivp |
mcFpuPop |
mov esi, glb_dbl_FpuPopper |
mov edi, glb_dbl_0dot333 |
call TCommon_X_exp_Y |
call TCommon_FP_Truncate |
mcStoreLocal loc26.nIWarp, eax |
mcOnRegZero eax, .L8 |
mcLoad8bitsToReg32 ecx, 152 |
call TConsole_Cram |
mcLoadLocal eax, loc26.nIWarp |
call TConsole_CramInt |
mcLoadLocal esi, loc26.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne .L6 |
mcLoad8bitsToReg32 ecx, 154 |
call TConsole_Prout |
jmp TMove_WarpX.done |
.L6: |
mov al, CHAR_COMMA |
call TConsole_PutChar |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 153 |
call TConsole_Prout |
jmp TMove_WarpX.done |
.L8: |
mcLoad8bitsToReg32 ecx, 151 |
call TConsole_Prout |
jmp TMove_WarpX.done |
.L10: |
; |
; Check the trip duration |
; |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esi + TREKDATA.WFACSQ] |
fdivp |
fstp [esi + TREKDATA.TIME] |
fld [esi + TREKDATA.REMTIME] |
fld [glb_dbl_0dot8] |
fmulp |
fld [esi + TREKDATA.TIME] |
mc_CMP_ST0_ST1 |
jc TMove_WarpX.L20 |
call TConsole_SetCrewMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 155 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 156 |
call TConsole_Cram |
mcLoadLocal esi, loc26.pTrekData |
fld [esi + TREKDATA.TIME] |
fld [esi + TREKDATA.REMTIME] |
fdivp |
fld [glb_dbl_100] |
fmulp |
mov cl, 2 |
call TConsole_CramFloat |
mcLoad8bitsToReg32 ecx, 157 |
call TConsole_Prout |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 158 |
call TGame_JA |
jc TMove_WarpX.L20 |
jmp TMove_WarpX.done |
; -------------------------------------------------------------------------- |
; WARPX |
; -------------------------------------------------------------------------- |
TMove_WarpX: |
mcBeginLocals loc26.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc26.pTrekData, esi |
.L20: |
mcZeroBits eax |
mcStoreLocal loc26.Blooey, eax |
mcStoreLocal loc26.TWarp, eax |
mcLoadLocal esi, loc26.pTrekData |
fld [glb_dbl_6] |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L50 |
jz .L50 |
; |
; Check if engines will get damaged by high warp |
; |
fld [esi + TREKDATA.WARPFAC] |
fld [glb_dbl_6] |
fsubp |
fld st |
fmulp |
fld [esi + TREKDATA.DIST] |
fmulp |
fld [glb_dbl_66dot666] |
fdivp |
call TRandom_Ranf |
fxch |
mc_CMP_ST0_ST1 |
jc .check_time_warp |
; |
; Engines will get damaged |
; |
inc [esp + loc26.Blooey] |
call TRandom_Ranf |
mcLoadLocal esi, loc26.pTrekData |
fld [esi + TREKDATA.DIST] |
fmulp |
fstp [esi + TREKDATA.DIST] |
.check_time_warp: |
mcLoadLocal esi, loc26.pTrekData |
fld [glb_dbl_Ten] |
fld [esi + TREKDATA.WARPFAC] |
mc_CMP_ST0_ST1 |
jc .L40 |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_0dot5] |
fmulp |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L40 |
inc [esp + loc26.TWarp] |
.L40: |
mcLoadLocal ecx, loc26.Blooey |
add ecx, [esp + loc26.TWarp] |
mcOnRegZero ecx, .L50 |
; |
; If ship will collide with something then cancel |
; engine damages or time warp. |
; |
mcLoadLocal esi, loc26.pTrekData |
fld [glb_dbl_0dot15] |
fld [esi + TREKDATA.DIREC] |
fsubp |
fld [glb_dbl_0dot5235998] |
fmulp |
fstp [esp + loc26.dblAngle] |
; |
; DELTAX = -SIN (ANGLE) |
; |
fld [esp + loc26.dblAngle] |
fsin |
fchs |
fstp [esp + loc26.dblDeltaX] |
; |
; DELTAY = COS (ANGLE) |
; |
fld [esp + loc26.dblAngle] |
fcos |
fstp [esp + loc26.dblDeltaY] |
fld [esp + loc26.dblDeltaX] |
fld [esp + loc26.dblDeltaY] |
call TMove_Bigger |
fstp [esp + loc26.dblBigger] |
fld [esp + loc26.dblDeltaX] |
fld [esp + loc26.dblBigger] |
fdivp |
fstp [esp + loc26.dblDeltaX] |
fld [esp + loc26.dblDeltaY] |
fld [esp + loc26.dblBigger] |
fdivp |
fstp [esp + loc26.dblDeltaY] |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esp + loc26.dblBigger] |
fmulp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc26.nSteps, eax |
mcOnRegZero eax, .L50 |
movzx eax, [esi + TREKDATA.SECTX] |
call TCommon_FPU_Load_EAX |
fstp [esp + loc26.dblSectX] |
movzx eax, [esi + TREKDATA.SECTY] |
call TCommon_FPU_Load_EAX |
fstp [esp + loc26.dblSectY] |
mcLoad1 ecx |
mcStoreLocal loc26.iStep, ecx |
.move_one_step: |
fld [esp + loc26.dblSectX] |
fld [esp + loc26.dblDeltaX] |
faddp |
fld st |
fstp [esp + loc26.dblSectX] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc26.iSectX, eax |
cmp eax, 1 |
jl .L50 |
cmp eax, 10 |
jg .L50 |
fld [esp + loc26.dblSectY] |
fld [esp + loc26.dblDeltaY] |
faddp |
fld st |
fstp [esp + loc26.dblSectY] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc26.iSectY, eax |
cmp eax, 1 |
jl .L50 |
cmp eax, 10 |
jg .L50 |
mcLoadLocal eax, loc26.iSectX |
mcLoadLocal edx, loc26.iSectY |
call TArray_QuadPtr |
cmp byte [ebx], CHAR_COSMOS |
je .move_one_step |
mcZeroBits eax |
mov [esp + loc26.Blooey], eax |
mov [esp + loc26.TWarp], eax |
.L50: |
mcLoadLocal edi, loc26.pTrekData |
mov [edi + TREKDATA.KSTUF4], 0 |
call TMove_Move |
mcLoadLocal esi, loc26.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
; |
; Deplete energy spent on move |
; |
fld [esi + TREKDATA.WARPFAC] |
fld st |
fld st |
fmulp |
fmulp |
fld [esi + TREKDATA.DIST] |
fmulp |
movzx eax, [esi + TREKDATA.SHLDUP] |
inc eax |
call TCommon_FPU_Load_EAX |
fmulp |
fld [esi + TREKDATA.ENERGY] |
fsubrp |
fld st |
fstp [esi + TREKDATA.ENERGY] |
fldz |
mc_CMP_ST0_ST1 |
jc .L55 |
mov al, 4 |
call TFinish_Main |
jmp .done |
.L55: |
cmp [esi + TREKDATA.KSTUF4], 0 |
jne .try_enter_time_warp |
; |
; Time needed for a trip |
; |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esi + TREKDATA.WFACSQ] |
fdivp |
fstp [esi + TREKDATA.TIME] |
.try_enter_time_warp: |
cmp [esp + loc26.TWarp], 0 |
je .damage_warp_engines |
call TMove_TimeWarp |
.damage_warp_engines: |
cmp [esp + loc26.Blooey], 0 |
je .L60 |
call TRandom_Ranf |
fld [glb_dbl_3] |
fmulp |
fld1 |
faddp |
mcLoadLocal esi, loc26.pTrekData |
fld [esi + TREKDATA.DAMFAC] |
fmulp |
mov cl, DEV_WARP_ENGINES |
call TArray_SetDblDamage |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 148 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 161 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 162 |
call TConsole_Prout |
.L60: |
mcLoadLocal edi, loc26.pTrekData |
inc [edi + TREKDATA.IDIDIT] |
jmp .done |
.L90: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 150 |
call TConsole_Prout |
.done: |
mcEndLocals loc26.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TMsgTable.Asm |
---|
0,0 → 1,191 |
; -------------------------------------------------------------------------- |
; FILE: TMsgTable.Asm |
; DATE: September 28, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_CountItems: |
mov esi, [glb_pRawMsgBuffer] |
mcZeroBits eax |
mcZeroBits ecx |
mcZeroBits edx |
.load_char: |
lodsb |
mcOnRegZero eax, .done |
cmp al, 0Dh |
sete dl |
add ecx, edx |
jmp .load_char |
.done: |
mov [glb_NumMsgItems], ecx |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_Parse: |
mov ecx, [glb_NumMsgItems] |
shl ecx, 2 |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, ecx |
mov [glb_pMsgItems], eax |
mov edi, eax |
mov esi, [glb_pRawMsgBuffer] |
mcZeroBits eax |
mov [glb_NumMsgItems], eax |
.load_char: |
lodsb |
mcOnRegZero eax, .done |
mcOnRegEqu al, '{', .begin_item |
mcOnRegEqu al, '}', .end_item |
jmp .load_char |
.begin_item: |
mov [edi], esi |
add edi, 4 |
inc [glb_NumMsgItems] |
jmp .load_char |
.end_item: |
lea edx, [esi - 1] |
mov byte [edx], 0 |
jmp .load_char |
.done: |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDI = buffer address |
; ECX = buffer size in bytes |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_Decrypt: |
pushad |
.reset_key: |
mov esi, TMsgTable_GetItem |
mcLoad8bitsToReg32 edx, 27 |
.next: |
lodsb |
xor [edi], al |
inc edi |
dec ecx |
jz .done |
dec edx |
jz .reset_key |
jmp .next |
.done: |
popad |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc4: |
.hFile HFILE ? |
.dwSize UINT32 ? |
.dwLoaded UINT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_Load: |
mcBeginLocals loc4.size |
invoke CreateFile, str_MsgFileName, GENERIC_READ, \ |
0, 0, OPEN_EXISTING, FILE_FLAG_SEQ_SCAN, 0 |
mcStoreLocal loc4.hFile, eax |
cmp eax, -1 |
je .done |
mov ebx, esp |
invoke GetFileSize, [ebx + loc4.hFile], 0 |
mcStoreLocal loc4.dwSize, eax |
mcOnRegZero eax, .close |
inc eax |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, eax |
mov [glb_pRawMsgBuffer], eax |
mcOnRegZero eax, .close |
mcLoadMemberRef edi, loc4.dwLoaded |
invoke ReadFile, [ebx + loc4.hFile], eax, \ |
[ebx + loc4.dwSize], edi, 0 |
mov edi, [glb_pRawMsgBuffer] |
mcLoadLocal ecx, loc4.dwLoaded |
mcZeroBits eax |
mov [edi + ecx], al |
call TMsgTable_Decrypt |
call TMsgTable_CountItems |
call TMsgTable_Parse |
.close: |
mov ebx, esp |
invoke CloseHandle, [ebx + loc4.hFile] |
.done: |
mcEndLocals loc4.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = item index (1-based) |
; Output: |
; ESI = points to ANSI text at specified index or empty string |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_GetItem: |
cmp ecx, [glb_NumMsgItems] |
ja .empty |
dec ecx |
push edx |
mov edx, [glb_pMsgItems] |
mov esi, [edx + ecx*4] |
pop edx |
ret |
.empty: |
mov esi, str_CharSizeText + 4 |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = item index (1-based) |
; Output: |
; EAX = string length |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TMsgTable_GetLength: |
push esi ecx |
call TMsgTable_GetItem |
mcZeroBits eax |
mcZeroBits ecx |
.next_char: |
lodsb |
mcOnRegZero eax, .done |
inc ecx |
jmp .next_char |
.done: |
mov eax, ecx |
pop ecx esi |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TNova.Asm |
---|
0,0 → 1,1410 |
; -------------------------------------------------------------------------- |
; FILE: TNova.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; NOVA |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X sector of nova |
; DL = Y sector of nova |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc54: |
.pTrekData PVOID ? |
.arr_HitsX BYTES 12 |
.arr_HitsY BYTES 12 |
.bIHURT BOOL ? |
.nBot INT32 ? |
.nTop INT32 ? |
.nTop2 INT32 ? |
.nKOUNT INT32 ? |
.nII INT32 ? |
.nJJ INT32 ? |
.nJ INT32 ? |
.nMM INT32 ? |
.nNN INT32 ? |
.nLL INT32 ? |
.nIX BYTE ? |
.nICX BYTE ? |
.nIY BYTE ? |
.nICY BYTE ? |
.chIQUAD BYTE ? |
.chIQUAD1 BYTE ? |
.nNewCX BYTE ? |
.nNewCY BYTE ? |
.arr_DblCourse DOUBLES 9 |
.dbl_HIT DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TNova_Main: |
mcBeginLocals loc54.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc54.pTrekData, esi |
mcStoreLocal loc54.nIX, al |
mcStoreLocal loc54.nIY, dl |
fld [glb_dbl_0dot05] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .do_supernova |
mcLoadLocal al, loc54.nIX |
mcLoadLocal dl, loc54.nIY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mov bl, CHAR_ASTERISK |
mcLoadLocal al, loc54.nIX |
mcLoadLocal dl, loc54.nIY |
call TConsole_CramEnemyAt |
mov ecx, 613 |
call TConsole_Prout |
call TArray_MyGalaxyPtr |
dec dword [ebx] |
; |
; IF (IPHWHO != 1) STARKL++ |
; |
mcLoadLocal esi, loc54.pTrekData |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .setup_stack |
inc [esi + TREKDATA.STARKL] |
.setup_stack: |
mcZeroBits eax |
mcStoreLocal loc54.nKOUNT, eax |
mcStoreLocal loc54.nICX, al |
mcStoreLocal loc54.nICY, al |
inc eax |
mcStoreLocal loc54.nBot, eax |
mcStoreLocal loc54.nTop, eax |
mcStoreLocal loc54.nTop2, eax |
; |
; Also setup COURSE array |
; |
mcLoadLocalRef edi, loc54.arr_DblCourse |
fld [glb_dbl_10dot5] |
fstp tbyte [edi] |
fld [glb_dbl_12] |
fstp tbyte [edi + 10] |
fld [glb_dbl_1dot5] |
fstp tbyte [edi + 20] |
fld [glb_dbl_9] |
fstp tbyte [edi + 30] |
fldz |
fstp tbyte [edi + 40] |
fld [glb_dbl_3] |
fstp tbyte [edi + 50] |
fld [glb_dbl_7dot5] |
fstp tbyte [edi + 60] |
fld [glb_dbl_6] |
fstp tbyte [edi + 70] |
fld [glb_dbl_4dot5] |
fstp tbyte [edi + 80] |
; |
; HITS (BOT,1) = IX |
; HITS (BOT,2) = IY |
; |
mcLoadLocalRef esi, loc54.arr_HitsX |
mcLoadLocalRef edi, loc54.arr_HitsY |
mcLoadLocal al, loc54.nIX |
mcLoadLocal dl, loc54.nIY |
mov [esi], al |
mov [edi], dl |
.L78: |
; |
; DO 90 MM=BOT,TOP |
; |
mcLoadLocal eax, loc54.nBot |
mcStoreLocal loc54.nMM, eax |
.MM_incremented: |
; |
; DO 90 NN=1,3 |
; |
mcLoad1 eax |
mcStoreLocal loc54.nNN, eax |
.NN_incremented: |
; |
; DO 90 J=1,3 |
; |
mcLoad1 eax |
mcStoreLocal loc54.nJ, eax |
.J_incremented: |
; |
; IF (J*NN == 4) GOTO 90 |
; |
mcLoadLocal ecx, loc54.nJ |
imul ecx, [esp + loc54.nNN] |
mcOnRegEqu ecx, 4, .next_J |
; |
; II = HITS (MM,1) + NN - 2 |
; JJ = HITS (MM,2) + J - 2 |
; |
mcLoadLocalRef esi, loc54.arr_HitsX |
mcLoadLocalRef edi, loc54.arr_HitsY |
mcLoadLocal ecx, loc54.nMM |
dec ecx |
movzx eax, byte [esi + ecx] |
movzx edx, byte [edi + ecx] |
add eax, [esp + loc54.nNN] |
add edx, [esp + loc54.nJ] |
sub eax, 2 |
sub edx, 2 |
mcStoreLocal loc54.nII, eax |
mcStoreLocal loc54.nJJ, edx |
; |
; Validate sector II,JJ |
; |
call TPhotons_IsValidSector |
jnc .next_J |
mov eax, edx |
call TPhotons_IsValidSector |
jnc .next_J |
; |
; IQUAD = QUAD (II,JJ) |
; |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TArray_QuadPtr |
mov cl, [ebx] |
mcStoreLocal loc54.chIQUAD, cl |
; |
; Space, black hole, "thing", tholian or its web are not affected |
; |
mcOnRegEqu cl, CHAR_COSMOS, .next_J |
mcOnRegEqu cl, CHAR_THING, .next_J |
mcOnRegEqu cl, CHAR_THOLIAN, .next_J |
mcOnRegEqu cl, CHAR_WEB, .next_J |
mcOnRegEqu cl, CHAR_BLACK_HOLE, .next_J |
; |
; IF (IQUAD != '*') GOTO 80 |
; |
mcOnRegNotEqu cl, CHAR_ASTERISK, .L80 |
; |
; Another star affected by nova |
; |
fld [glb_dbl_0dot05] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .do_secondary_supernova |
; |
; TOP2++ |
; HITS (TOP2,1) = II |
; HITS (TOP2,2) = JJ |
; |
inc [esp + loc54.nTop2] |
mov ecx, [esp + loc54.nTop2] |
dec ecx |
mcLoadLocalRef esi, loc54.arr_HitsX |
mcLoadLocalRef edi, loc54.arr_HitsY |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
mov [esi + ecx], al |
mov [edi + ecx], dl |
; |
; Decrease star count in the quadrant |
; |
call TArray_MyGalaxyPtr |
dec dword [ebx] |
; |
; IF (IPHWHO != 1) STARKL++ |
; |
mcLoadLocal esi, loc54.pTrekData |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .next_nova_msg |
inc [esi + TREKDATA.STARKL] |
.next_nova_msg: |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mov bl, CHAR_ASTERISK |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TConsole_CramEnemyAt |
mov ecx, 613 |
call TConsole_Cram |
jmp .L8905 |
.L80: |
cmp [esp + loc54.chIQUAD], CHAR_PLANET |
jne .L8002 |
; |
; Planet destroyed by nova |
; |
call TArray_MyNewStufPtr |
dec byte [ebx] |
; |
; IF (IPHWHO != 1) NPLANKL++ |
; |
mcLoadLocal esi, loc54.pTrekData |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .planet_killed_msg |
inc [esi + TREKDATA.NPLANKL] |
.planet_killed_msg: |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mov bl, CHAR_PLANET |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TConsole_CramEnemyAt |
mov ecx, 306 |
call TConsole_Cram |
mcLoadLocal esi, loc54.pTrekData |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
mcZeroBits eax |
stosd |
stosb |
mov [esi + TREKDATA.IPLANET], al |
mov [esi + TREKDATA.PLNETX], al |
mov [esi + TREKDATA.PLNETY], al |
cmp [esi + TREKDATA.LANDED], 1 |
jne .L8905 |
mov al, 16 |
call TFinish_Main |
jmp .done |
.L8002: |
cmp [esp + loc54.chIQUAD], CHAR_STARBASE |
jne .L82 |
; |
; Nova destroys starbase |
; |
call TArray_MyGalaxyPtr |
sub dword [ebx], 10 |
mcLoadLocal esi, loc54.pTrekData |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TEvents_RemoveThisBase |
mcLoadLocal esi, loc54.pTrekData |
dec [esi + TREKDATA.REMBASE] |
mov [esi + TREKDATA.BASEX], 0 |
mov [esi + TREKDATA.BASEY], 0 |
; |
; IF (IPHWHO != 1) BASEKL++ |
; |
mcLoadLocal esi, loc54.pTrekData |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .base_killed_msg |
inc [esi + TREKDATA.BASEKL] |
.base_killed_msg: |
mov [esi + TREKDATA.CONDIT], 0 |
call TCommon_NewCondition |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mov bl, CHAR_STARBASE |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TConsole_CramEnemyAt |
mov ecx, 306 |
call TConsole_Cram |
jmp .L8905 |
; |
; HIT = 800.0 + 800.0*RANF(0) |
; |
.L82: |
call TRandom_Ranf |
fld [glb_dbl_800] |
fmulp |
fld [glb_dbl_800] |
faddp |
fstp [esp + loc54.dbl_HIT] |
mcLoadLocal esi, loc54.pTrekData |
mov al, [esi + TREKDATA.SHIP] |
cmp [esp + loc54.chIQUAD], al |
jne .L87 |
; |
; Starship hit by nova! |
; |
call TConsole_SetGameMsgAttr |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
mov ecx, 614 |
call TConsole_Cram |
mcLoadLocal esi, loc54.pTrekData |
mov [esi + TREKDATA.KSHOT], 0 |
mcLoadLocalRef esi, loc54.dbl_HIT |
mcLoadLocalRef edi, loc54.bIHURT |
mcZeroBits ecx |
call TAttack_Zap |
mcLoadLocal esi, loc54.pTrekData |
fldz |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jnc .L86 |
mov al, 7 |
call TFinish_Main |
jmp .done |
.L86: |
; |
; Nova kicks starship away |
; |
mcLoadLocal ecx, loc54.nMM |
dec ecx |
mcLoadLocalRef ebx, loc54.arr_HitsX |
mcLoadLocalRef edx, loc54.arr_HitsY |
mov al, [ebx + ecx] |
mov dl, [edx + ecx] |
mov cl, [esi + TREKDATA.SECTX] |
sub cl, al |
add [esp + loc54.nICX], cl |
mov cl, [esi + TREKDATA.SECTY] |
sub cl, al |
add [esp + loc54.nICY], cl |
inc [esp + loc54.nKOUNT] |
jmp .next_J |
.L87: |
; |
; Enemy ship hit by nova! |
; |
cmp [esp + loc54.chIQUAD], CHAR_KLINGON |
je .L88 |
; |
; Find enemy index in KX,KY arrays |
; |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
mcLoadLocal esi, loc54.pTrekData |
movzx ecx, [esi + TREKDATA.NENHERE] |
lea edi, [esi + TREKDATA.KY] |
add esi, TREKDATA.KX |
mcZeroBits ebx |
.find_enemy_ship: |
inc ebx |
cmp [esi], al |
jne .next_ship |
cmp [edi], dl |
jne .next_ship |
mcStoreLocal loc54.nLL, ebx |
jmp .hit_the_enemy |
.next_ship: |
inc esi |
inc edi |
loop .find_enemy_ship |
;int 3 |
jmp .next_J |
.hit_the_enemy: |
; |
; KPOWER (LL) -= HIT |
; |
mcLoadLocal esi, loc54.pTrekData |
lea ebx, [esi + TREKDATA.KPOWER] |
mcLoadLocal ecx, loc54.nLL |
dec ecx |
imul ecx, 10 |
fld tbyte [ebx + ecx] |
fld [esp + loc54.dbl_HIT] |
fsubp |
fstp tbyte [ebx + ecx] |
fldz |
fld tbyte [ebx + ecx] |
mc_CMP_ST0_ST1 |
jc .L88 |
; |
; NEWCX = II + II - HITS (MM,1) |
; NEWCY = JJ + JJ - HITS (MM,2) |
; |
mcLoadLocalRef esi, loc54.arr_HitsX |
mcLoadLocalRef edi, loc54.arr_HitsY |
mcLoadLocal ecx, loc54.nMM |
dec ecx |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
add eax, eax |
add edx, edx |
sub al, [esi + ecx] |
sub dl, [edi + ecx] |
mcStoreLocal loc54.nNewCX, al |
mcStoreLocal loc54.nNewCY, dl |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mcLoadLocal bl, loc54.chIQUAD |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TConsole_CramEnemyAt |
mov ecx, 615 |
call TConsole_Cram |
movzx eax, [esp + loc54.nNewCX] |
call TPhotons_IsValidSector |
jnc .L8703 |
movzx eax, [esp + loc54.nNewCY] |
call TPhotons_IsValidSector |
jnc .L8703 |
; |
; IQUAD1 = QUAD (NEWCX,NEWCY) |
; |
mcLoadLocal al, loc54.nNewCX |
mcLoadLocal dl, loc54.nNewCY |
call TArray_QuadPtr |
mov cl, [ebx] |
mcStoreLocal loc54.chIQUAD1, cl |
mcOnRegNotEqu cl, CHAR_BLACK_HOLE, .L87025 |
; |
; Enemy displaced into black hole! |
; |
mov ecx, 616 |
call TConsole_Prout |
jmp .L88 |
.L87025: |
mcOnRegNotEqu cl, CHAR_COSMOS, .L8703 |
mov ecx, 617 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal al, loc54.nNewCX |
mcLoadLocal dl, loc54.nNewCY |
call TConsole_CramLoc |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
mcLoadLocal al, loc54.nNewCX |
mcLoadLocal dl, loc54.nNewCY |
call TArray_QuadPtr |
mcLoadLocal cl, loc54.chIQUAD |
mov [ebx], cl |
mcLoadLocal al, loc54.nNewCX |
mcLoadLocal dl, loc54.nNewCY |
mcLoadLocal ecx, loc54.nLL |
dec ecx |
mcLoadLocal esi, loc54.pTrekData |
lea edi, [esi + TREKDATA.KY] |
add esi, TREKDATA.KX |
mov [esi + ecx], al |
mov [edi + ecx], dl |
imul ecx, 10 |
mcLoadLocal esi, loc54.pTrekData |
lea edi, [esi + TREKDATA.KDIST] |
sub al, [esi + TREKDATA.SECTX] |
sub dl, [esi + TREKDATA.SECTY] |
movsx eax, al |
movsx edx, dl |
imul eax, eax |
imul edx, edx |
add eax, edx |
call TCommon_FPU_Load_EAX |
fsqrt |
fstp tbyte [edi + ecx] |
.L8703: |
call TConsole_ScrollUp |
jmp .next_J |
.L88: |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TPhasers_DeadKlingon |
jmp .next_J |
.L8905: |
call TConsole_ScrollUp |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
.next_J: |
inc [esp + loc54.nJ] |
cmp [esp + loc54.nJ], 3 |
jbe .J_incremented |
inc [esp + loc54.nNN] |
cmp [esp + loc54.nNN], 3 |
jbe .NN_incremented |
inc [esp + loc54.nMM] |
mov eax, [esp + loc54.nTop] |
cmp [esp + loc54.nMM], eax |
jbe .MM_incremented |
; |
; Check if more stars affected by nova |
; |
mov eax, [esp + loc54.nTop] |
cmp [esp + loc54.nTop2], eax |
je .L93 |
inc eax |
mcStoreLocal loc54.nBot, eax |
mov eax, [esp + loc54.nTop2] |
mcStoreLocal loc54.nTop, eax |
jmp .L78 |
.L93: |
cmp [esp + loc54.nKOUNT], 0 |
je .done |
; |
; Starship affected by nova - kick it away |
; |
mcLoadLocal esi, loc54.pTrekData |
fild [esp + loc54.nKOUNT] |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esi + TREKDATA.DIST] |
cmp [esp + loc54.nICX], 0 |
je .L9301 |
mcLoad1 eax |
movsx ecx, [esp + loc54.nICX] |
call TAttack_ISign |
mcStoreLocal loc54.nICX, al |
.L9301: |
cmp [esp + loc54.nICY], 0 |
je .L9302 |
mcLoad1 eax |
movsx ecx, [esp + loc54.nICY] |
call TAttack_ISign |
mcStoreLocal loc54.nICY, al |
.L9302: |
; |
; INDEX = 3*(ICX+1) + ICY + 2 |
; |
movsx ecx, [esp + loc54.nICX] |
inc ecx |
imul ecx, 3 |
movsx eax, [esp + loc54.nICY] |
add ecx, eax |
add ecx, 2 |
cmp ecx, 1 |
jb .assertion_failed |
cmp ecx, 9 |
ja .assertion_failed |
dec ecx |
imul ecx, 10 |
mcLoadLocalRef ebx, loc54.arr_DblCourse |
fld tbyte [ebx + ecx] |
fstp [esi + TREKDATA.DIREC] |
fld [esi + TREKDATA.DIREC] |
fldz |
mc_CMP_ST0_ST1 |
jnz .check_distance |
fldz |
fstp [esi + TREKDATA.DIST] |
.check_distance: |
fld [esi + TREKDATA.DIST] |
fldz |
mc_CMP_ST0_ST1 |
jz .done |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_12] |
fmulp |
fstp [esi + TREKDATA.TIME] |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 618 |
call TConsole_Cram |
call TConsole_CramShip |
call TMove_Move |
jmp .done |
.do_secondary_supernova: |
mcLoadLocal eax, loc54.nII |
mcLoadLocal edx, loc54.nJJ |
jmp .call_snova |
.assertion_failed: |
;int 3 |
jmp .done |
.do_supernova: |
mcLoadLocal al, loc54.nIX |
mcLoadLocal dl, loc54.nIY |
.call_snova: |
call TNova_SuperNova |
.done: |
mcEndLocals loc54.size |
ret |
; -------------------------------------------------------------------------- |
; SNOVA |
; -------------------------------------------------------------------------- |
; Input: |
; AL = X sector of supernova |
; DL = Y sector of supernova |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc55: |
.pTrekData PVOID ? |
.pChart PINT32 ? |
.pGalaxy PINT32 ? |
.iNSX INDEX ? |
.iNSY INDEX ? |
.iNUM INDEX ? |
.iNQX INDEX ? |
.iNQY INDEX ? |
.nInputSectorX BYTE ? |
.nInputSectorY BYTE ? |
.__pad_1 BYTE ? |
.__pad_2 BYTE ? |
.nKLDEAD COUNT ? |
.nCOMDEAD COUNT ? |
.nISCDEAD COUNT ? |
.nRMDEAD COUNT ? |
.nNPDEAD COUNT ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TNova_SuperNova: |
mcBeginLocals loc55.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc55.pTrekData, esi |
movzx eax, al |
movzx edx, dl |
mcStoreLocal loc55.iNSX, eax |
mcStoreLocal loc55.iNSY, edx |
mcStoreLocal loc55.nInputSectorX, al |
mcStoreLocal loc55.nInputSectorY, dl |
test eax, edx |
jnz .L50 |
mov edx, [esi + TREKDATA.INSTAR] |
call TRandom_IRan |
inc eax |
mcStoreLocal loc55.iNUM, eax |
mcLoad1 eax |
mcStoreLocal loc55.iNQX, eax |
._NQX_incremented: |
mcLoad1 eax |
mcStoreLocal loc55.iNQY, eax |
._NQY_incremented: |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_GetGalaxyValue |
mcOnRegEqu ecx, 1000, .done |
mov eax, ecx |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 10 |
div ecx |
sub [esp + loc55.iNUM], edx |
js .L20 |
jz .L20 |
.next_quad: |
inc [esp + loc55.iNQY] |
cmp [esp + loc55.iNQY], 8 |
jbe ._NQY_incremented |
inc [esp + loc55.iNQX] |
cmp [esp + loc55.iNQX], 8 |
jbe ._NQX_incremented |
jmp .done |
.L20: |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_GetGalaxyValue |
mcOnRegEqu ecx, 1000, .done |
mcLoadLocal esi, loc55.pTrekData |
mcLoadLocal eax, loc55.iNQX |
cmp al, [esi + TREKDATA.QUADX] |
jne .L70 |
mcLoadLocal eax, loc55.iNQY |
cmp al, [esi + TREKDATA.QUADY] |
jne .L70 |
; |
; The supernova is in this quadrant! |
; |
cmp [esi + TREKDATA.JUSTIN], 0 |
jne .L70 |
call TArray_MyGalaxyPtr |
mov eax, [ebx] |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 10 |
div ecx |
mcOnRegZero edx, .done |
call TRandom_IRan |
inc eax |
mcStoreLocal loc55.iNUM, eax |
mcLoadLocal esi, loc55.pTrekData |
add esi, TREKDATA.QUAD |
mcLoad8bitsToReg32 ecx, 100 |
mcZeroBits edx |
.find_star: |
lodsb |
mcOnRegNotEqu al, CHAR_ASTERISK, .next_star |
dec [esp + loc55.iNUM] |
jz .L50 |
.next_star: |
inc edx |
loop .find_star |
jmp .done |
.L50: |
call TConsole_ScrollUp |
call TMove_RedAlert |
call TConsole_SetGameMsgAttr |
mov ecx, 619 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal eax, loc55.iNSX |
mcLoadLocal edx, loc55.iNSY |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mcLoadLocal esi, loc55.pTrekData |
movzx eax, [esi + TREKDATA.QUADX] |
movzx edx, [esi + TREKDATA.QUADY] |
mcStoreLocal loc55.iNQX, eax |
mcStoreLocal loc55.iNQY, edx |
; |
; Supernova adjacent to ship ends game! |
; |
movzx eax, [esi + TREKDATA.SECTX] |
sub eax, [esp + loc55.iNSX] |
imul eax, eax |
movzx ecx, [esi + TREKDATA.SECTY] |
sub ecx, [esp + loc55.iNSY] |
imul ecx, ecx |
add eax, ecx |
cmp ecx, 2 |
ja .L80 |
mov ecx, 620 |
call TConsole_ProutGameMsg |
call TPlanet_Stars |
mcLoadLocal edi, loc55.pTrekData |
mov [edi + TREKDATA.ALLDONE], 1 |
jmp .L80 |
.L70: |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jc .L80 |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 621 |
call TConsole_Cram |
mcLoadLocal esi, loc55.pTrekData |
mov cl, 1 |
fld [esi + TREKDATA.DATE] |
call TConsole_CramFloat |
call TConsole_ScrollUp |
mov ecx, 622 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TConsole_CramLoc |
mov ecx, 623 |
call TConsole_Prout |
.L80: |
; |
; A wave of total destruction in the quadrant!! |
; |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_GetGalaxyValue |
mcStoreLocal loc55.iNUM, ecx |
mcLoad8bitsToReg32 eax, 100 |
xchg eax, ecx |
mcZeroBits edx |
div ecx |
mcStoreLocal loc55.nKLDEAD, eax |
mcZeroBits eax |
mcStoreLocal loc55.nCOMDEAD, eax |
mcStoreLocal loc55.nISCDEAD, eax |
mcLoadLocal esi, loc55.pTrekData |
mcLoadLocal eax, loc55.iNQX |
cmp al, [esi + TREKDATA.ISX] |
jne .L85 |
mcLoadLocal eax, loc55.iNQY |
cmp al, [esi + TREKDATA.ISY] |
jne .L85 |
mcZeroBits eax |
mov [esi + TREKDATA.NSCREM], al |
mov [esi + TREKDATA.ISX], al |
mov [esi + TREKDATA.ISY], al |
mov [esi + TREKDATA.ISATB], al |
mov [esi + TREKDATA.ISCATE], al |
inc [esp + loc55.nISCDEAD] |
fld [glb_dbl_1E38] |
fld st |
fstp [esi + TREKDATA.FUTURE6] |
fstp [esi + TREKDATA.FUTURE7] |
.L85: |
cmp [esp + loc55.nKLDEAD], 0 |
je .L100 |
mcLoadLocal eax, loc55.nKLDEAD |
sub [esi + TREKDATA.REMKL], al |
cmp [esi + TREKDATA.REMCOM], 0 |
je .L100 |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TPhasers_RemoveCommander |
jnc .L100 |
dec [esp + loc55.nKLDEAD] |
inc [esp + loc55.nCOMDEAD] |
mcLoadLocal esi, loc55.pTrekData |
cmp [esi + TREKDATA.REMCOM], 0 |
jne .L100 |
fld [glb_dbl_1E38] |
fstp [esi + TREKDATA.FUTURE2] |
.L100: |
; |
; Destroy Romulans and planets |
; |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_NewStufPtr |
movzx ecx, byte [ebx] |
mcStoreLocal loc55.iNUM, ecx |
mcZeroBits eax |
mov [ebx], al |
; |
; NRMDEAD = NUM/10 |
; |
mov eax, ecx |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 10 |
div ecx |
mcStoreLocal loc55.nRMDEAD, eax |
mcStoreLocal loc55.nNPDEAD, edx |
mcLoadLocal esi, loc55.pTrekData |
sub [esi + TREKDATA.NROMREM], al |
cmp [esp + loc55.nNPDEAD], 0 |
je .L109 |
; |
; Remove planet in quadrant NQX,NQY |
; |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_FindPlanet |
jecxz .L109 |
mov edi, esi |
mcZeroBits eax |
stosd |
stosb |
.L109: |
; |
; Destroy base (if any) in quadrant NQX,NQY |
; |
mcLoadLocal esi, loc55.pTrekData |
cmp [esi + TREKDATA.REMBASE], 0 |
je .L120 |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TEvents_RemoveThisBase |
jnc .L120 |
mcLoadLocal esi, loc55.pTrekData |
dec [esi + TREKDATA.REMBASE] |
.L120: |
; |
; If starship caused supernova, tally up the destruction |
; |
cmp [esp + loc55.iNSX], 0 |
je .L130 |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_GetGalaxyValue |
mov eax, ecx |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 100 |
div ecx |
mcStoreLocal loc55.iNUM, edx |
mcLoadLocal eax, loc55.nKLDEAD |
mcLoadLocal edx, loc55.nCOMDEAD |
mcLoadLocal ecx, loc55.nRMDEAD |
mcLoadLocal ebx, loc55.nISCDEAD |
mcLoadLocal esi, loc55.pTrekData |
add [esi + TREKDATA.KILLK], al |
add [esi + TREKDATA.KILLC], dl |
add [esi + TREKDATA.NROMKL], cl |
add [esi + TREKDATA.NSCKILL], bl |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .L130 |
mcZeroBits edx |
mcLoad8bitsToReg32 ecx, 10 |
mcLoadLocal eax, loc55.iNUM |
div ecx |
add [esi + TREKDATA.BASEKL], al |
add [esi + TREKDATA.STARKL], dl |
mcLoadLocal eax, loc55.nNPDEAD |
add [esi + TREKDATA.NPLANKL], al |
.L130: |
; |
; Mark supernova in galaxy and in star chart |
; |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_StarChartPtr |
mcStoreLocal loc55.pChart, ebx |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TArray_GalaxyPtr |
mcStoreLocal loc55.pGalaxy, ebx |
mcLoadLocal esi, loc55.pChart |
cmp dword [esi], 0 |
jle .L131 |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jnc .L131 |
mcLoadLocal esi, loc55.pGalaxy |
mov eax, [esi] |
add eax, 1000 |
mcLoadLocal edi, loc55.pChart |
mov [edi], eax |
.L131: |
mov cl, DEV_SUBSPACE_RADIO |
call TArray_IsDamaged |
jnc .mark_chart |
mcLoadLocal esi, loc55.pTrekData |
mcLoadLocal eax, loc55.iNQX |
cmp [esi + TREKDATA.QUADX], al |
jne .L132 |
mcLoadLocal eax, loc55.iNQY |
cmp [esi + TREKDATA.QUADY], al |
jne .L132 |
.mark_chart: |
mcLoadLocal edi, loc55.pChart |
mov dword [edi], 1 |
.L132: |
mcLoadLocal edi, loc55.pGalaxy |
mov dword [edi], 1000 |
; |
; If supernova destroys last klingons, give special message |
; |
mcLoadLocal esi, loc55.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
jne .L140 |
mcLoadLocal eax, loc55.iNQX |
cmp [esi + TREKDATA.QUADX], al |
jne .win_by_supernova |
mcLoadLocal eax, loc55.iNQY |
cmp [esi + TREKDATA.QUADY], al |
je .L140 |
.win_by_supernova: |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
mov ecx, 624 |
call TConsole_ProutGameMsg |
mov ecx, 625 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal eax, loc55.iNQX |
mcLoadLocal edx, loc55.iNQY |
call TConsole_CramLoc |
mov ecx, 626 |
call TConsole_Prout |
mov al, 1 |
call TFinish_Main |
jmp .done |
.L140: |
mcLoadLocal esi, loc55.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
je .done |
mov al, 8 |
call TFinish_Main |
.done: |
mcEndLocals loc55.size |
ret |
; -------------------------------------------------------------------------- |
; AUTOVER, GRAB |
; -------------------------------------------------------------------------- |
; Input: |
; AL = finishing code if game will end (II in original source) |
; CL =0 if AUTOVER called, =1 if GRAB called (IGRAB in original source) |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc53: |
.pTrekData PVOID ? |
.bIGRAB BYTE ? |
.bII BYTE ? |
.pad_1 BYTE ? |
.pad_2 BYTE ? |
.dbl_POWER DOUBLE ? |
.dbl_DISTREQ DOUBLE ? |
.dbl_DISTMAX DOUBLE ? |
.pad_11 BYTE ? |
.pad_22 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TNova_AutomaticOverride: |
mcBeginLocals loc53.size |
mcStoreLocal loc53.bIGRAB, cl |
mcStoreLocal loc53.bII, al |
mcLoadGameDataPtr esi |
mcStoreLocal loc53.pTrekData, esi |
cmp [esi + TREKDATA.LANDED], 1 |
jne .L45 |
mov cl, DEV_TRANSPORTER |
call TArray_IsDamaged |
jc .L25 |
mov ecx, 600 |
call TConsole_ProutGameMsg |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L20 |
mov ecx, 601 |
call TConsole_Prout |
jmp .L25 |
.L20: |
mov ecx, 602 |
call TConsole_Cram |
invoke Sleep, 1200 |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
mc_CMP_ST0_ST1 |
jc .L30 |
mov ecx, 573 |
call TConsole_Prout |
.L25: |
mcLoadLocal al, loc53.bII |
.finished: |
call TFinish_Main |
jmp .done |
.L30: |
mov ecx, 574 |
call TConsole_Prout |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.IMINE], 0 |
je .L45 |
mov [esi + TREKDATA.IMINE], 0 |
mov ecx, 603 |
call TConsole_Cram |
call TRandom_Ranf |
fld [glb_dbl_DOCKFAC] |
mc_CMP_ST0_ST1 |
jc .L40 |
mov ecx, 604 |
call TConsole_Prout |
jmp .L45 |
.L40: |
mov ecx, 605 |
call TConsole_Prout |
mcLoadLocal esi, loc53.pTrekData |
mov [esi + TREKDATA.ICRYSTL], 1 |
.L45: |
cmp [esp + loc53.bIGRAB], 0 |
jne .done |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.ICRAFT], 0 |
je .try_override |
mov al, 17 |
jmp .finished |
.try_override: |
call TConsole_ScrollUp |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.JUSTIN], 0 |
je .L50 |
.L47: |
call TMove_RedAlert |
call TConsole_SetGameMsgAttr |
mov ecx, 606 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 607 |
call TConsole_Prout |
mov ecx, 608 |
call TConsole_Prout |
call TConsole_ScrollUp |
.L50: |
call TConsole_SetGameMsgAttr |
mov ecx, 609 |
call TConsole_Cram |
call TConsole_CramShip |
call TConsole_ScrollUp |
mov ecx, 610 |
call TConsole_Prout |
; |
; STARCH (QUADX,QUADY) = 1 |
; |
mcLoad1 ecx |
mcLoadLocal esi, loc53.pTrekData |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TArray_SetStarChartValue |
; |
; Try to use warp engines... |
; |
mov cl, DEV_WARP_ENGINES |
call TArray_IsDamaged |
jnc .L100 |
call TConsole_ScrollUp |
mov ecx, 150 |
call TConsole_ProutGameMsg |
mov al, 8 |
jmp .finished |
.L100: |
call TRandom_Ranf |
fld [glb_dbl_2] |
fmulp |
fld [glb_dbl_6] |
faddp |
mcLoadLocal esi, loc53.pTrekData |
fstp [esi + TREKDATA.WARPFAC] |
fld [esi + TREKDATA.WARPFAC] |
fld st |
fmulp |
fstp [esi + TREKDATA.WFACSQ] |
call TConsole_SetGameMsgAttr |
mov ecx, 611 |
call TConsole_Cram |
mov cl, 1 |
mcLoadLocal esi, loc53.pTrekData |
fld [esi + TREKDATA.WARPFAC] |
call TConsole_CramFloat |
call TConsole_ScrollUp |
mcLoadLocal esi, loc53.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_0dot75] |
fmulp |
fstp [esp + loc53.dbl_POWER] |
fld [esi + TREKDATA.WARPFAC] |
fld st |
fld st |
fmulp |
fmulp |
mov al, [esi + TREKDATA.SHLDUP] |
call TCommon_LoadByteIntoFPU |
fmulp |
fld [esp + loc53.dbl_POWER] |
fdivrp |
fstp [esp + loc53.dbl_DISTMAX] |
call TRandom_Ranf |
fld [glb_dbl_2] |
fmulp |
fld [glb_dbl_1dot4142] |
faddp |
fstp [esp + loc53.dbl_DISTREQ] |
fld [esp + loc53.dbl_DISTREQ] |
fld [esp + loc53.dbl_DISTMAX] |
call TCommon_FPU_Min |
mcLoadLocal esi, loc53.pTrekData |
fstp [esi + TREKDATA.DIST] |
fld [esi + TREKDATA.DIST] |
fld [glb_dbl_Ten] |
fmulp |
fld [esi + TREKDATA.WFACSQ] |
fdivp |
fstp [esi + TREKDATA.TIME] |
call TRandom_Ranf |
fld [glb_dbl_12] |
fmulp |
mcLoadLocal esi, loc53.pTrekData |
fstp [esi + TREKDATA.DIREC] |
mcZeroBits eax |
mov [esi + TREKDATA.JUSTIN], al |
mov [esi + TREKDATA.INORBIT], al |
invoke Sleep, 1000 |
call TMove_WarpX |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
cmp [esi + TREKDATA.JUSTIN], 0 |
jne .L200 |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
call TConsole_Cram3Asterisks |
call TConsole_CramShip |
mov ecx, 612 |
call TConsole_Prout |
mov al, 8 |
jmp .finished |
.L200: |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
je .L47 |
mcLoadLocal esi, loc53.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
jne .done |
mov al, 1 |
jmp .finished |
.done: |
mcEndLocals loc53.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TPhasers.Asm |
---|
0,0 → 1,1424 |
; -------------------------------------------------------------------------- |
; FILE: TPhasers.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; AL = quadrant X of a COMMANDER |
; DL = quadrant Y of a COMMANDER |
; Output: |
; CF=1 if commander was removed |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_RemoveCommander: |
pushad |
mcLoadGameDataPtr ebx |
cmp [ebx + TREKDATA.REMCOM], 0 |
je .not_removed |
mcLoadMemberRef esi, TREKDATA.CX |
mcLoadMemberRef edi, TREKDATA.CY |
mcZeroBits ecx |
.find_commander: |
cmp [esi + ecx], al |
jne .next_commander |
cmp [edi + ecx], dl |
jne .next_commander |
; |
; Replace commander by the last entry |
; |
movzx edx, [ebx + TREKDATA.REMCOM] |
dec edx |
push edx |
mov al, [esi + edx] |
mov dl, [edi + edx] |
mov [esi + ecx], al |
mov [edi + ecx], dl |
mcZeroBits eax |
pop edx |
mov [esi + edx], al |
mov [edi + edx], al |
dec [ebx + TREKDATA.REMCOM] |
popad |
stc |
ret |
.next_commander: |
inc ecx |
cmp cl, [ebx + TREKDATA.REMCOM] |
jb .find_commander |
.not_removed: |
popad |
clc |
ret |
; -------------------------------------------------------------------------- |
; DEADKL |
; -------------------------------------------------------------------------- |
; Input: |
; AL = sector X of an enemy |
; DL = sector Y of an enemy |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc41: |
.pTrekData PVOID ? |
.pQUAD PBYTE ? |
.nTYPE BYTE ? |
.nIXX BYTE ? |
.nIYY BYTE ? |
.nEnemies BYTE ? |
.nJ INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_DeadKlingon: |
mcBeginLocals loc41.size |
mcStoreLocal loc41.nIXX, al |
mcStoreLocal loc41.nIYY, dl |
call TArray_QuadPtr |
mcStoreLocal loc41.pQUAD, ebx |
mov cl, [ebx] |
mcStoreLocal loc41.nTYPE, cl |
mcLoadGameDataPtr ebx |
mcStoreLocal loc41.pTrekData, ebx |
call TConsole_SetGameMsgAttr |
mcLoadLocal al, loc41.nIXX |
mcLoadLocal dl, loc41.nIYY |
mcLoadLocal bl, loc41.nTYPE |
mov cl, 2 |
call TConsole_CramEnemyAt |
mcLoadLocal al, loc41.nTYPE |
mcOnRegEqu al, CHAR_THOLIAN, .L30 |
mcOnRegEqu al, CHAR_ROMULAN, .L27 |
call TArray_MyGalaxyPtr |
sub dword [ebx], 100 |
mcLoadLocal edi, loc41.pTrekData |
dec [edi + TREKDATA.KLHERE] |
dec [edi + TREKDATA.REMKL] |
mcLoadLocal al, loc41.nTYPE |
mcOnRegEqu al, CHAR_KLINGON, .L25 |
mcOnRegEqu al, CHAR_SCOM, .L26 |
; |
; COMMANDER finds his fate! |
; |
mcLoadLocal edi, loc41.pTrekData |
mov [edi + TREKDATA.COMHERE], 0 |
mov al, [edi + TREKDATA.QUADX] |
mov dl, [edi + TREKDATA.QUADY] |
call TPhasers_RemoveCommander |
fld [glb_dbl_1E38] |
fstp [edi + TREKDATA.FUTURE2] |
cmp [edi + TREKDATA.REMCOM], 0 |
je .kill_commander |
mov al, [edi + TREKDATA.INCOM] |
call TCommon_LoadByteIntoFPU |
mov al, [edi + TREKDATA.REMCOM] |
call TCommon_LoadByteIntoFPU |
fdivp |
push edi |
call TCommon_ExpRan |
pop edi |
fld [edi + TREKDATA.DATE] |
faddp |
fstp [edi + TREKDATA.FUTURE2] |
.kill_commander: |
inc [edi + TREKDATA.KILLC] |
jmp .L30 |
.L25: |
; |
; Ordinary KLINGON wasted! |
; |
inc [edi + TREKDATA.KILLK] |
jmp .L30 |
.L26: |
; |
; SUPER-COMMANDER finally brought down! |
; |
mcZeroBits eax |
mov [edi + TREKDATA.NSCREM], al |
mov [edi + TREKDATA.ISHERE], al |
mov [edi + TREKDATA.ISX], al |
mov [edi + TREKDATA.ISY], al |
mov [edi + TREKDATA.ISATB], al |
mov [edi + TREKDATA.ISCATE], al |
inc [edi + TREKDATA.NSCKILL] |
fld [glb_dbl_1E38] |
fld st |
fstp [edi + TREKDATA.FUTURE6] |
fstp [edi + TREKDATA.FUTURE7] |
jmp .L30 |
.L27: |
; |
; ROMULAN destroyed! |
; |
call TArray_MyNewStufPtr |
sub byte [ebx], 10 |
dec [edi + TREKDATA.IRHERE] |
dec [edi + TREKDATA.NROMREM] |
inc [edi + TREKDATA.NROMKL] |
.L30: |
; |
; Finish message |
; |
mov ecx, 306 |
call TConsole_Prout |
mcLoadLocal ebx, loc41.pQUAD |
mov byte [ebx], CHAR_COSMOS |
mcLoadLocal esi, loc41.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .done |
mov al, [esi + TREKDATA.REMCOM] |
shl al, 2 |
add al, [esi + TREKDATA.REMKL] |
call TCommon_LoadByteIntoFPU |
fld [esi + TREKDATA.REMRES] |
fdivrp |
fstp [esi + TREKDATA.REMTIME] |
; |
; Kill Tholian |
; |
cmp [esp + loc41.nTYPE], CHAR_THOLIAN |
je .kill_tholian |
; |
; Remove enemy ship from arrays describing local conditions |
; |
mov cl, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc41.nEnemies, cl |
lea edi, [esi + TREKDATA.KY] |
add esi, TREKDATA.KX |
mcZeroBits ecx |
mcLoadLocal al, loc41.nIXX |
mcLoadLocal dl, loc41.nIYY |
.find_enemy_ship: |
cmp al, [esi + ecx] |
jne .next_ship |
cmp dl, [edi + ecx] |
je .L45 |
.next_ship: |
inc ecx |
cmp cl, [esp + loc41.nEnemies] |
jb .find_enemy_ship |
;int 3 |
jmp .done |
.L45: |
inc ecx |
mcLoadLocal ebx, loc41.pTrekData |
dec [ebx + TREKDATA.NENHERE] |
dec [esp + loc41.nEnemies] |
cmp cl, [ebx + TREKDATA.NENHERE] |
ja .L55 |
; |
; Shift all ships up to delete the killed one |
; |
mcStoreLocal loc41.nJ, ecx |
.remove_ship: |
mcLoadLocal ecx, loc41.nJ |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
dec ecx |
mov al, [esi + ecx + 1] |
mov dl, [edi + ecx + 1] |
mov [esi + ecx], al |
mov [edi + ecx], dl |
imul ecx, 10 |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcLoadMemberRef edi, TREKDATA.KDIST |
fld tbyte [esi + ecx + 10] |
fld tbyte [edi + ecx + 10] |
fstp tbyte [edi + ecx] |
fstp tbyte [esi + ecx] |
inc [esp + loc41.nJ] |
mov ecx, [esp + loc41.nJ] |
cmp cl, [esp + loc41.nEnemies] |
jbe .remove_ship |
.L55: |
; |
; Cleanup the tail of arrays |
; |
movzx ecx, [esp + loc41.nEnemies] |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcZeroBits eax |
mov [esi + ecx], al |
mov [edi + ecx], al |
imul ecx, 10 |
fldz |
fldz |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcLoadMemberRef edi, TREKDATA.KDIST |
fstp tbyte [esi + ecx] |
fstp tbyte [edi + ecx] |
jmp .done |
.kill_tholian: |
dec [esi + TREKDATA.ITHERE] |
.done: |
mcEndLocals loc41.size |
ret |
; -------------------------------------------------------------------------- |
; HITEM |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = pointer to array of DOUBLE values with hits |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc40: |
.pTrekData PVOID ? |
.pHITS PDOUBLE ? |
.nNENHER2 COUNT ? |
.nK INDEX ? |
.nKK INDEX ? |
.dbl_KP DOUBLE ? |
.dbl_KPOW DOUBLE ? |
.pKPOWER PDOUBLE ? |
.pKDIST PDOUBLE ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.nII BYTE ? |
.nJJ BYTE ? |
.n1 BYTE ? |
.n2 BYTE ? |
.dbl_HIT DOUBLE ? |
.dbl_WHAM DOUBLE ? |
.dbl_DUSTFAC DOUBLE ? |
.dbl_1 DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_HitThem: |
mcBeginLocals loc40.size |
mcLoadGameDataPtr edi |
mcStoreLocal loc40.pTrekData, edi |
mcStoreLocal loc40.pHITS, esi |
movzx eax, [edi + TREKDATA.NENHERE] |
mcStoreLocal loc40.nNENHER2, eax |
lea ebx, [edi + TREKDATA.KX] |
lea ecx, [edi + TREKDATA.KY] |
lea esi, [edi + TREKDATA.KPOWER] |
lea eax, [edi + TREKDATA.KDIST] |
mcStoreLocal loc40.pKX, ebx |
mcStoreLocal loc40.pKY, ecx |
mcStoreLocal loc40.pKPOWER, esi |
mcStoreLocal loc40.pKDIST, eax |
call TConsole_ScrollUp |
mcLoad1 eax |
mcStoreLocal loc40.nKK, eax |
mcStoreLocal loc40.nK, eax |
.next_hit: |
invoke Sleep, 500 |
mcLoadLocal ecx, loc40.nK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pHITS |
fld tbyte [esi + ecx] |
fstp [esp + loc40.dbl_WHAM] |
fldz |
fld [esp + loc40.dbl_WHAM] |
mc_CMP_ST0_ST1 |
jz .L30 |
call TRandom_Ranf |
fld [glb_dbl_0dot01] |
fmulp |
fld [glb_dbl_0dot9] |
faddp |
fstp [esp + loc40.dbl_DUSTFAC] |
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKDIST |
lea edi, [esi + ecx] |
mcLoadLocalRef esi, loc40.dbl_DUSTFAC |
call TCommon_X_exp_Y |
fld [esp + loc40.dbl_WHAM] |
fmulp |
fstp [esp + loc40.dbl_HIT] |
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKPOWER |
fld tbyte [esi + ecx] |
fstp [esp + loc40.dbl_KP] |
fld [esp + loc40.dbl_KP] |
fabs |
fld [esp + loc40.dbl_HIT] |
fld st |
faddp |
call TCommon_FPU_Min |
fld [esp + loc40.dbl_KP] |
call TCommon_FPU_SignAB |
fld [esp + loc40.dbl_KP] |
fsubrp |
fld st |
fstp tbyte [esi + ecx] |
fstp [esp + loc40.dbl_KPOW] |
mcLoadLocal ecx, loc40.nKK |
dec ecx |
mcLoadLocal esi, loc40.pKX |
mcLoadLocal edi, loc40.pKY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcStoreLocal loc40.nII, al |
mcStoreLocal loc40.nJJ, dl |
call TConsole_SetGameMsgAttr |
fld [esp + loc40.dbl_HIT] |
fld [glb_dbl_0dot005] |
mc_CMP_ST0_ST1 |
jc .L10 |
mov ecx, 302 |
call TConsole_Cram |
jmp .L20 |
.L10: |
fld [esp + loc40.dbl_HIT] |
mov cl, 2 |
call TConsole_CramFloat |
mov ecx, 303 |
call TConsole_Cram |
.L20: |
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TConsole_CramEnemyAtEx |
call TConsole_ScrollUp |
fldz |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jnz .L25 |
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TPhasers_DeadKlingon |
mcLoadLocal esi, loc40.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .game_won |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
jmp .L40 |
.L25: |
fldz |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jc .L30 |
fld [glb_dbl_0dot9] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L30 |
call TRandom_Ranf |
fld [glb_dbl_0dot4] |
fmulp |
fld [glb_dbl_0dot4] |
faddp |
fld [esp + loc40.dbl_KP] |
fmulp |
fld [esp + loc40.dbl_KPOW] |
mc_CMP_ST0_ST1 |
jnc .L30 |
call TConsole_SetCrewMsgAttr |
mov ecx, 304 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal al, loc40.nII |
mcLoadLocal dl, loc40.nJJ |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mov ecx, 305 |
call TConsole_Prout |
fld [esp + loc40.dbl_KPOW] |
fchs |
mcLoadLocal ecx, loc40.nKK |
dec ecx |
imul ecx, 10 |
mcLoadLocal esi, loc40.pKPOWER |
fstp tbyte [esi + ecx] |
.L30: |
inc [esp + loc40.nKK] |
.L40: |
; |
; Next hit |
; |
inc [esp + loc40.nK] |
mov ecx, [esp + loc40.nK] |
cmp ecx, [esp + loc40.nNENHER2] |
jbe .next_hit |
jmp .done |
.game_won: |
mov al, 1 |
call TFinish_Main |
.done: |
mcEndLocals loc40.size |
ret |
; -------------------------------------------------------------------------- |
; PHASERS |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc39: |
.pTrekData PVOID ? |
.bIFAST BOOL ? |
.bIPOOP BOOL ? |
.bIDOIT BOOL ? |
.bNO BOOL ? |
.nK INDEX ? |
.nI INDEX ? |
.pIWHERE PVOID ? |
.nEnemies COUNT ? |
.nKEY UINT32 ? |
.nKEY1 UINT32 ? |
.nKEY2 UINT32 ? |
.nIREC UINT32 ? |
.pszAITEM PCHAR ? |
.dbl_POW DOUBLE ? |
.dbl_POWREM DOUBLE ? |
.dbl_EXTRA DOUBLE ? |
.dbl_TEMP DOUBLE ? |
.dbl_PART1 DOUBLE ? |
.dbl_PART2 DOUBLE ? |
.dbl_HITS_I_ DOUBLE ? |
.dbl_OVER DOUBLE ? |
.arr_HITS DOUBLES 20 |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhasers_Main: |
mcBeginLocals loc39.size |
call TConsole_SetGameMsgAttr |
mcLoadGameDataPtr esi |
mcStoreLocal loc39.pTrekData, esi |
movzx ecx, [esi + TREKDATA.NENHERE] |
mcStoreLocal loc39.nEnemies, ecx |
mcZeroBits eax |
mcStoreLocal loc39.bIFAST, eax |
mcStoreLocal loc39.bNO, eax |
mcStoreLocal loc39.nIREC, eax |
inc eax |
mcStoreLocal loc39.bIPOOP, eax |
mcStoreLocal loc39.bIDOIT, eax |
mov [esi + TREKDATA.IDIDIT], al |
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
adc [esp + loc39.nIREC], 0 |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
adc [esp + loc39.nIREC], 0 |
cmp [esp + loc39.nIREC], 0 |
je .check_firing_solution |
dec [esp + loc39.bIPOOP] |
.check_firing_solution: |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L5 |
mov ecx, 274 |
call TConsole_Prout |
jmp .L19 |
.L5: |
mov cl, DEV_PHASERS |
call TArray_IsDamaged |
jnc .L10 |
mov ecx, 275 |
call TConsole_Prout |
jmp .L19 |
.L10: |
; |
; Do checks for hi-speed shield control |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L20 |
mov cl, DEV_SHIELD_CONTROL |
call TArray_IsDamaged |
jnc .L13 |
mov ecx, 276 |
call TConsole_Prout |
jmp .L19 |
.L13: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
mc_CMP_ST0_ST1 |
jc .L16 |
mov ecx, 277 |
call TConsole_Prout |
.L19: |
dec [esp + loc39.bIDOIT] |
cmp [esp + loc39.bIPOOP], 0 |
je .L15 |
cmp [esp + loc39.nEnemies], 0 |
je .L15 |
mov ecx, 278 |
call TConsole_Prout |
jmp .L870 |
.L15: |
mcLoadLocal esi, loc39.pTrekData |
dec [esi + TREKDATA.IDIDIT] |
cmp [esp + loc39.bIFAST], 0 |
je .done |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
faddp |
fstp [esi + TREKDATA.ENERGY] |
jmp .done |
.L16: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_200] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
inc [esp + loc39.bIFAST] |
.L20: |
; |
; Read in amount of energy to expend on phaser fire |
; |
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
movzx ecx, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, ecx |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
cmp [esp + loc39.nEnemies], 0 |
je .L35 |
mcLoad1 edx |
mcStoreLocal loc39.nK, edx |
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
je .L23 |
cmp [esp + loc39.nKEY], CMD_TOKEN_REAL |
je .L28 |
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L23 |
inc [esp + loc39.bNO] |
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
movzx ecx, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, ecx |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
.L23: |
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
jne .check_devices |
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 165 |
call TCmdBuf_Crop |
jc .L90 |
.check_devices: |
mov cl, DEV_COMPUTER |
call TArray_IsDamaged |
jc .L80 |
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
jc .L81 |
; |
; Is KEY = EOL, 'AUTO' or phaser power |
; |
cmp [esp + loc39.nKEY], CMD_TOKEN_ALPHA |
jne .L2301 |
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 166 |
call TCmdBuf_Crop |
jc .L27 |
jmp .L24 |
.L2301: |
; |
; Differentiate between EOL and phaser power (command mode) |
; |
cmp [esp + loc39.nKEY], CMD_TOKEN_EOL |
jne .L30 |
.L24: |
; |
; Request MANUAL/AUTO fire |
; |
mcLoad8bitsToReg32 ecx, 174 |
call TGame_Prompt |
call TConsole_SetGameMsgAttr |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
add eax, 0 |
js .L15 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
jne .L24 |
mcLoad8bitsToReg32 ecx, 165 |
call TCmdBuf_Crop |
jc .L90 |
mcLoad8bitsToReg32 ecx, 166 |
call TCmdBuf_Crop |
jnc .L24 |
.L2409: |
; |
; Inform user of available energy and read in |
; desired phaser power |
; |
cmp [esp + loc39.nEnemies], 0 |
je .L26 |
mov ecx, 279 |
call TConsole_Cram |
.L25: |
mcLoadLocal esi, loc39.pTrekData |
mov cl, 2 |
fld [esi + TREKDATA.ENERGY] |
call TConsole_CramFloat |
call TConsole_ScrollUp |
cmp [esp + loc39.bIPOOP], 0 |
je .L26 |
mov al, '(' |
call TConsole_PutChar |
mcZeroBits eax |
mcStoreLocal loc39.nIREC, eax |
inc eax |
mcStoreLocal loc39.nK, eax |
.sum_all_power: |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_1dot01] |
faddp |
fstp [esp + loc39.dbl_PART2] |
mov esi, glb_dbl_0dot9 |
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
call TCommon_X_exp_Y |
fld st |
faddp |
fstp [esp + loc39.dbl_PART1] |
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
fld [esp + loc39.dbl_PART1] |
fdivp |
fld [esp + loc39.dbl_PART2] |
fmulp |
call TCommon_FP_Truncate |
inc eax |
add [esp + loc39.nIREC], eax |
inc [esp + loc39.nK] |
mcLoadLocal ecx, loc39.nK |
cmp ecx, [esp + loc39.nEnemies] |
jbe .sum_all_power |
mcLoadLocal eax, loc39.nIREC |
call TConsole_CramInt |
mov ecx, 280 |
call TConsole_Prout |
.L26: |
mov ecx, 281 |
call TGame_Prompt |
.L27: |
call TCmdBuf_Scan |
movzx eax, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY, eax |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc39.dbl_POW] |
.L28: |
mcLoadLocal eax, loc39.nKEY |
mcStoreLocal loc39.nKEY1, eax |
cmp eax, CMD_TOKEN_EOL |
je .L2409 |
.L30: |
call TCmdBuf_Scan |
mcStoreLocal loc39.pszAITEM, esi |
movzx eax, [ebx + TCmdBuf.cmdbuf_KEY] |
mcStoreLocal loc39.nKEY2, eax |
mcLoadLocal eax, loc39.nKEY1 |
mcStoreLocal loc39.nKEY, eax |
cmp [esp + loc39.nKEY2], CMD_TOKEN_EOL |
je .L35 |
mcLoadLocal esi, loc39.pszAITEM |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L34 |
inc [esp + loc39.bNO] |
jmp .L35 |
.L34: |
call TMove_BegPardon |
jmp .L15 |
.L35: |
cmp [esp + loc39.nKEY], CMD_TOKEN_REAL |
jne .L26 |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L41 |
mov ecx, 282 |
call TConsole_Cram |
jmp .L25 |
.L41: |
fld [esp + loc39.dbl_POW] |
fld [glb_dbl_5] |
mc_CMP_ST0_ST1 |
jc .L46 |
jz .L46 |
fldz |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L15 |
jz .L15 |
mov ecx, 283 |
call TConsole_Prout |
jmp .L15 |
.L42: |
; |
; Print message for shield control |
; and decide if malfunction occurs |
; |
call TConsole_ScrollUp |
fld [glb_dbl_0dot995] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L45 |
; |
; Malfunction! |
; |
call TMove_RedAlert |
call TConsole_SetCrewMsgAttr |
mov ecx, 284 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 285 |
call TConsole_Prout |
jmp .done |
.L45: |
call TConsole_SetGameMsgAttr |
mov ecx, 229 |
call TConsole_Prout |
jmp [esp + loc39.pIWHERE] |
.L46: |
; |
; Allocate energy among klingons according to |
; nearest first strategy and compute hits |
; |
cmp [esp + loc39.bIFAST], 0 |
je .L47 |
mov eax, .L47 |
mcStoreLocal loc39.pIWHERE, eax |
jmp .L42 |
.L47: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
fsubp |
fld st |
fstp [esi + TREKDATA.ENERGY] |
fstp [esp + loc39.dbl_EXTRA] |
cmp [esp + loc39.nEnemies], 0 |
je .L75 |
; |
; Loop that distribute hits in automatic mode |
; |
fldz |
fstp [esp + loc39.dbl_EXTRA] |
fld [esp + loc39.dbl_POW] |
fstp [esp + loc39.dbl_POWREM] |
mcLoad1 eax |
mcStoreLocal loc39.nI, eax |
.compute_hit: |
fldz |
fstp [esp + loc39.dbl_HITS_I_] |
fldz |
fld [esp + loc39.dbl_POWREM] |
mc_CMP_ST0_ST1 |
jc .L50 |
jz .L50 |
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nI |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
mov esi, glb_dbl_0dot9 |
call TCommon_X_exp_Y |
fld st |
faddp |
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
fdivrp |
fld st |
fstp [esp + loc39.dbl_HITS_I_] |
fstp [esp + ecx + loc39.arr_HITS] |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_0dot01] |
faddp |
fld [esp + loc39.dbl_HITS_I_] |
fmulp |
fstp [esp + loc39.dbl_OVER] |
fld [esp + loc39.dbl_POWREM] |
fstp [esp + loc39.dbl_TEMP] |
fld [esp + loc39.dbl_POWREM] |
fld [esp + loc39.dbl_HITS_I_] |
fsubp |
fld [esp + loc39.dbl_OVER] |
fsubp |
fld st |
fstp [esp + loc39.dbl_POWREM] |
fldz |
mc_CMP_ST0_ST1 |
jc .extra_plus_over |
fld [esp + loc39.dbl_TEMP] |
fld [esp + loc39.dbl_HITS_I_] |
call TCommon_FPU_Min |
fstp [esp + loc39.dbl_HITS_I_] |
fldz |
fstp [esp + loc39.dbl_OVER] |
mcLoadLocal ecx, loc39.nI |
dec ecx |
imul ecx, 10 |
fld [esp + loc39.dbl_HITS_I_] |
fstp [esp + ecx + loc39.arr_HITS] |
.extra_plus_over: |
fld [esp + loc39.dbl_EXTRA] |
fld [esp + loc39.dbl_OVER] |
faddp |
fstp [esp + loc39.dbl_EXTRA] |
.L50: |
inc [esp + loc39.nI] |
mov ecx, [esp + loc39.nI] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .compute_hit |
fldz |
fld [esp + loc39.dbl_POWREM] |
mc_CMP_ST0_ST1 |
jc .hit_them |
jz .hit_them |
fld [esp + loc39.dbl_EXTRA] |
fld [esp + loc39.dbl_POWREM] |
faddp |
fstp [esp + loc39.dbl_EXTRA] |
.hit_them: |
mcLoadLocalRef esi, loc39.arr_HITS |
call TPhasers_HitThem |
fldz |
fld [esp + loc39.dbl_EXTRA] |
mc_CMP_ST0_ST1 |
jz .L200 |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .L200 |
.L75: |
; |
; Inform of overkill |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ITHERE], 0 |
je .L78 |
call TConsole_SetGameMsgAttr |
mov ecx, 286 |
call TConsole_Cram |
cmp [esp + loc39.nEnemies], 0 |
je .L7501 |
mov ecx, 287 |
call TConsole_Cram |
.L7501: |
mov ecx, 288 |
call TConsole_Prout |
jmp .L200 |
.L78: |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
fld [esp + loc39.dbl_EXTRA] |
call TConsole_CramFloat |
mov ecx, 289 |
call TConsole_Prout |
jmp .L200 |
.L80: |
; |
; Manual section begins here. |
; Inform of imposed manual condition. |
; |
call TConsole_SetGameMsgAttr |
mov ecx, 299 |
call TConsole_Prout |
jmp .L84 |
.L81: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mov ecx, 290 |
call TConsole_Prout |
mov ecx, 291 |
call TConsole_Prout |
mov ecx, 292 |
call TConsole_Prout |
mov ecx, 293 |
call TConsole_Prout |
call TConsole_ScrollUp |
.L84: |
call TConsole_SetGameMsgAttr |
mov ecx, 282 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_0dot006] |
fsubp |
call TConsole_CramFloat |
call TConsole_ScrollUp |
.L870: |
; |
; Loop for desired individual hits |
; |
mcLoad1 eax |
mcStoreLocal loc39.nK, eax |
.L87: |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
cmp [esp + loc39.bIPOOP], 0 |
je .L88 |
; |
; Print battle computer recommendation |
; |
mov al, '(' |
call TConsole_PutChar |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
fmulp |
fld [glb_dbl_1dot01] |
faddp |
fstp [esp + loc39.dbl_PART2] |
mov esi, glb_dbl_0dot9 |
mcLoadLocal ebx, loc39.pTrekData |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
lea edi, [ebx + ecx + TREKDATA.KDIST] |
call TCommon_X_exp_Y |
fld st |
faddp |
fstp [esp + loc39.dbl_PART1] |
fld [ebx + ecx + TREKDATA.KPOWER] |
fabs |
fld [esp + loc39.dbl_PART1] |
fdivp |
fld [esp + loc39.dbl_PART2] |
fmulp |
call TCommon_FP_Truncate |
inc eax |
call TConsole_CramInt |
mov ecx, 300 |
call TConsole_Cram |
.L88: |
mov ecx, 294 |
call TConsole_Cram |
mcLoadLocal ecx, loc39.nK |
mcLoadLocal ebx, loc39.pTrekData |
dec ecx |
lea esi, [ebx + TREKDATA.KX] |
lea edi, [ebx + TREKDATA.KY] |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
call TConsole_CramEnemyAtEx |
cmp [esp + loc39.bIDOIT], 1 |
je .L89 |
; |
; Phasers can't actually be fired - loop back for |
; next computer readout or terminate if that's all. |
; |
call TConsole_ScrollUp |
inc [esp + loc39.nK] |
mov ecx, [esp + loc39.nK] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .L87 |
jmp .L15 |
.L89: |
mov ecx, 301 |
call TGame_Prompt |
.L90: |
cmp [esp + loc39.nK], 1 |
jne .scan_hit |
fldz |
fstp [esp + loc39.dbl_POW] |
.scan_hit: |
call TCmdBuf_Scan |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
mcLoadLocal ecx, loc39.nK |
dec ecx |
imul ecx, 10 |
fld st |
fstp [esp + ecx + loc39.arr_HITS] |
fstp [esp + loc39.dbl_HITS_I_] |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L95 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne .L91 |
cmp [esp + loc39.nK], 1 |
je .L84 |
jmp .L87 |
.L91: |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L84 |
inc [esp + loc39.bNO] |
jmp .L90 |
.L95: |
fldz |
fld [esp + loc39.dbl_HITS_I_] |
mc_CMP_ST0_ST1 |
jc .L15 |
fld [esp + loc39.dbl_POW] |
fld [esp + loc39.dbl_HITS_I_] |
faddp |
fstp [esp + loc39.dbl_POW] |
; |
; If total amount is too much, then |
; inform and start over. |
; |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .L97 |
call TConsole_SetGameMsgAttr |
mov ecx, 295 |
call TConsole_Prout |
jmp .L84 |
.L97: |
inc [esp + loc39.nK] |
mov ecx, [esp + loc39.nK] |
cmp ecx, [esp + loc39.nEnemies] |
jbe .L90 |
; |
; If total requested is 0.0 - abort phasers. |
; |
fldz |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jz .L15 |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
jne .L9701 |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
adc [esp + loc39.bNO], 0 |
.L9701: |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc39.dbl_POW] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
cmp [esp + loc39.bIFAST], 0 |
je .L98 |
mov eax, .L98 |
mcStoreLocal loc39.pIWHERE, eax |
jmp .L42 |
.L98: |
mcLoadLocalRef esi, loc39.arr_HITS |
call TPhasers_HitThem |
mcLoadLocal edi, loc39.pTrekData |
inc [edi + TREKDATA.IDIDIT] |
.L200: |
; |
; Raising shields after phaser fire. |
; |
mcLoadLocal esi, loc39.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
cmp [esp + loc39.bIFAST], 0 |
je .L210 |
call TConsole_ScrollUp |
cmp [esp + loc39.bNO], 0 |
jne .L202 |
fld [glb_dbl_0dot99] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .L205 |
call TConsole_SetCrewMsgAttr |
mov ecx, 296 |
call TConsole_Prout |
mov ecx, 297 |
call TConsole_Prout |
.L202: |
mcLoadLocal edi, loc39.pTrekData |
mov [edi + TREKDATA.SHLDUP], 0 |
jmp .L210 |
.L205: |
call TConsole_SetGameMsgAttr |
mov ecx, 228 |
call TConsole_Prout |
.L210: |
; |
; Check for phaser overheat |
; |
fld [glb_dbl_1500] |
fld [esp + loc39.dbl_POW] |
mc_CMP_ST0_ST1 |
jc .done |
jz .done |
fld [esp + loc39.dbl_POW] |
fld [glb_dbl_1500] |
fsubp |
fld [glb_dbl_0dot00038] |
fmulp |
fstp [esp + loc39.dbl_TEMP] |
call TRandom_Ranf |
fld [esp + loc39.dbl_TEMP] |
mc_CMP_ST0_ST1 |
jc .done |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 298 |
call TConsole_Prout |
call TRandom_Ranf |
fld1 |
faddp |
fld [esp + loc39.dbl_TEMP] |
fld1 |
faddp |
fmulp |
mcLoadLocal esi, loc39.pTrekData |
fld [esi + TREKDATA.DAMFAC] |
fmulp |
mov cl, DEV_PHASERS |
call TArray_SetDblDamage |
.done: |
mcEndLocals loc39.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TPhotons.Asm |
---|
0,0 → 1,1571 |
; -------------------------------------------------------------------------- |
; FILE: TPhotons.Asm |
; DATE: November 1, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = sector coordinate (X or Y) |
; Output: |
; CF=1 if EAX is in range [1..10] |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhotons_IsValidSector: |
cmp eax, 1 |
jb .invalid |
cmp eax, 10 |
ja .invalid |
stc |
ret |
.invalid: |
clc |
ret |
; -------------------------------------------------------------------------- |
; PHOTONS |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc44: |
.pTrekData PVOID ? |
.pdbl_KPower PDOUBLE ? |
.nN COUNT ? |
.nTubes COUNT ? |
.bIHURT BOOL ? |
.nI INDEX ? |
.nJ INDEX ? |
.nLL INDEX ? |
.nL INDEX ? |
.nJX INT32 ? |
.nJY INT32 ? |
.torp_IX INT32 ? |
.torp_IY INT32 ? |
.byte_IX BYTE ? |
.byte_IY BYTE ? |
.byte_STARTX BYTE ? |
.byte_STARTY BYTE ? |
.arr_TARGX INTEGERS 6 |
.arr_TARGY INTEGERS 6 |
; |
; I have added here another 3 DOUBLE values (30 bytes) to "improve" the game. |
; However, that caused a misalignment of the local variables, which |
; in turn caused the failure of a Sleep API!! (MORALE: Always align the stack!) |
; Thanks to 'Clerk' from WASM.RU forum I was able to fix the issue. |
; |
.arr_COURSE DOUBLES 6 |
.dbl_R DOUBLE ? |
.dbl_AC DOUBLE ? |
.dbl_TEMP DOUBLE ? |
.dbl_DELTX DOUBLE ? |
.dbl_DELTY DOUBLE ? |
.dbl_HIT DOUBLE ? |
.dbl_ANGLE DOUBLE ? |
.dbl_DELTAX DOUBLE ? |
.dbl_DELTAY DOUBLE ? |
.dbl_BIGGER DOUBLE ? |
.dbl_SINANG DOUBLE ? |
.dbl_X DOUBLE ? |
.dbl_Y DOUBLE ? |
.dbl_DIST DOUBLE ? |
.dbl_DISTN DOUBLE ? |
.dbl_KP DOUBLE ? |
.dbl_ANG DOUBLE ? |
.dbl_SPRANG DOUBLE ? |
.dbl_BETA DOUBLE ? |
.ch_IQUAD CHAR ? |
.ch_reserved CHAR ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPhotons_Main: |
mcBeginLocals loc44.size |
call TConsole_SetGameMsgAttr |
mcLoadGameDataPtr esi |
mcStoreLocal loc44.pTrekData, esi |
; |
; Check torpedo count and status of photon tubes |
; |
mov [esi + TREKDATA.IDIDIT], 1 |
mov [esi + TREKDATA.KSHOT], 0 |
movzx ecx, [esi + TREKDATA.NPTUBES] |
mcStoreLocal loc44.nTubes, ecx |
mov cl, DEV_PHOTON_TUBES |
call TArray_IsDamaged |
jnc .L10 |
mov ecx, 340 |
call TConsole_Prout |
jmp .L3005 |
.L10: |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.TORPS], 0 |
jne .L15 |
mov ecx, 341 |
call TConsole_Prout |
jmp .L3005 |
.L15: |
call TCmdBuf_Scan |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mcStoreLocal loc44.nN, eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L30 |
.L16: |
mcLoadLocal esi, loc44.pTrekData |
movzx eax, [esi + TREKDATA.TORPS] |
call TConsole_CramInt |
mov ecx, 342 |
call TConsole_Prout |
mov ecx, 343 |
call TGame_Prompt |
jmp .L15 |
.L30: |
mcLoadLocal eax, loc44.nN |
cmp eax, 0 |
jle .L3005 |
cmp eax, [esp + loc44.nTubes] |
jle .L31 |
mov ecx, 344 |
call TConsole_Cram |
mcLoadLocal esi, loc44.pTrekData |
movzx eax, [esi + TREKDATA.NPTUBES] |
call TConsole_CramInt |
mov ecx, 704 |
call TConsole_Prout |
jmp .L16 |
.L3004: |
call TMove_BegPardon |
.L3005: |
mcLoadLocal edi, loc44.pTrekData |
dec [edi + TREKDATA.IDIDIT] |
jmp KPHOTON.done |
.L31: |
mcLoadLocal esi, loc44.pTrekData |
mcLoadLocal eax, loc44.nN |
cmp al, [esi + TREKDATA.TORPS] |
jle .L32 |
jmp .L16 |
.L3101: |
; |
; All torpedoes fired at same spot |
; |
cmp [esp + loc44.nN], 1 |
je .L36 |
mcLoadLocalRef esi, loc44.arr_TARGX |
mcLoadLocalRef edi, loc44.arr_TARGY |
mov eax, [esi] |
mov edx, [edi] |
mov [esi + 4], eax |
mov [edi + 4], edx |
cmp [esp + loc44.nN], 2 |
je .L36 |
mov [esi + 8], eax |
mov [edi + 8], edx |
jmp .L36 |
.L32: |
; |
; Read in target sectors |
; |
mcLoad1 eax |
mcStoreLocal loc44.nI, eax |
.scan_next_target: |
call TCmdBuf_Scan |
mcLoadLocal ecx, loc44.nI |
dec ecx |
mcLoadLocalRef esi, loc44.arr_TARGX |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mov [esi + ecx*4], eax |
; |
; IF ((I == 1) AND (CMD == EOL)) GOTO 34 |
; |
cmp [esp + loc44.nI], 1 |
jne .L3201 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .L34 |
.L3201: |
; |
; IF ((I == 2) AND (CMD == EOL)) GOTO 3101 |
; |
cmp [esp + loc44.nI], 2 |
jne .L3202 |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .L3101 |
.L3202: |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L3004 |
call TCmdBuf_Scan |
mcLoadLocal ecx, loc44.nI |
dec ecx |
mcLoadLocalRef esi, loc44.arr_TARGY |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mov [esi + ecx*4], eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L3004 |
inc [esp + loc44.nI] |
mov ecx, [esp + loc44.nI] |
cmp ecx, [esp + loc44.nN] |
jbe .scan_next_target |
jmp .L36 |
.L34: |
mcLoad1 eax |
mcStoreLocal loc44.nI, eax |
.ask_target_sector: |
mov cl, ATTR_PROMPT_TEXT |
call TConsole_SetAttr |
mov ecx, 345 |
call TConsole_Cram |
mcLoadLocal eax, loc44.nI |
call TConsole_CramInt |
mov ecx, 301 |
call TGame_Prompt |
call TCmdBuf_Scan |
mcLoadLocal ecx, loc44.nI |
dec ecx |
mcLoadLocalRef esi, loc44.arr_TARGX |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mov [esi + ecx*4], eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L3004 |
call TCmdBuf_Scan |
mcLoadLocal ecx, loc44.nI |
dec ecx |
mcLoadLocalRef esi, loc44.arr_TARGY |
mov eax, [ebx + TCmdBuf.cmdbuf_INUM] |
mov [esi + ecx*4], eax |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
jne .L3004 |
inc [esp + loc44.nI] |
mov ecx, [esp + loc44.nI] |
cmp ecx, [esp + loc44.nN] |
jbe .ask_target_sector |
.L36: |
; |
; Check for invalid targets |
; |
mcLoadLocal ecx, loc44.nN |
mcLoadLocalRef esi, loc44.arr_TARGX |
mcLoadLocalRef edi, loc44.arr_TARGY |
.validate_sector: |
mov eax, [edi] |
add edi, 4 |
add eax, 0 |
js .L3005 |
call TPhotons_IsValidSector |
jnc .L3004 |
lodsd |
add eax, 0 |
js .L3005 |
call TPhotons_IsValidSector |
jnc .L3004 |
loop .validate_sector |
; |
; Compute course for each torpedo |
; |
mcLoad1 eax |
mcStoreLocal loc44.nI, eax |
.next_course: |
mcLoadLocal ecx, loc44.nI |
dec ecx |
mcLoadLocalRef esi, loc44.arr_TARGY |
mov eax, [esi + ecx*4] |
mcLoadLocal ebx, loc44.pTrekData |
movzx edx, [ebx + TREKDATA.SECTY] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTX] |
mcLoadLocalRef esi, loc44.arr_TARGX |
mov edx, [esi + ecx*4] |
movzx eax, [ebx + TREKDATA.SECTX] |
sub eax, edx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTY] |
; |
; Do not shoot the ENTERPRISE! |
; |
fld [esp + loc44.dbl_DELTX] |
fldz |
mc_CMP_ST0_ST1 |
jnz .L40 |
fld [esp + loc44.dbl_DELTY] |
fldz |
mc_CMP_ST0_ST1 |
jnz .L40 |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 346 |
call TConsole_Prout |
mov ecx, 347 |
call TConsole_Prout |
mov ecx, 348 |
call TConsole_Prout |
jmp .L3005 |
.L40: |
fld [esp + loc44.dbl_DELTX] |
fld [esp + loc44.dbl_DELTY] |
fpatan |
fld [glb_dbl_1dot90985932] |
fmulp |
mcLoadLocal ecx, loc44.nI |
dec ecx |
imul ecx, 10 |
mcLoadLocalRef edi, loc44.arr_COURSE |
fstp tbyte [edi + ecx] |
inc [esp + loc44.nI] |
mov ecx, [esp + loc44.nI] |
cmp ecx, [esp + loc44.nN] |
jbe .next_course |
; |
; Begin outer loop for moving torpedoes |
; |
mcZeroBits eax |
mcStoreLocal loc44.nI, eax |
.L50: |
inc [esp + loc44.nI] |
mov ecx, [esp + loc44.nI] |
cmp ecx, [esp + loc44.nN] |
ja KPHOTON.L115 |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L50001 |
dec [esi + TREKDATA.TORPS] |
jnz .L50001 |
mov [esi + TREKDATA.QTORPS], 0 |
.L50001: |
; |
; J=I |
; |
mcLoadLocal eax, loc44.nI |
mcStoreLocal loc44.nJ, eax |
mov al, [esi + TREKDATA.SECTX] |
mov dl, [esi + TREKDATA.SECTY] |
mcStoreLocal loc44.byte_STARTX, al |
mcStoreLocal loc44.byte_STARTY, dl |
call TRandom_Ranf |
call TRandom_Ranf |
faddp |
fld [glb_dbl_0dot5] |
fmulp |
fld [glb_dbl_0dot5] |
fsubp |
fstp [esp + loc44.dbl_R] |
fld [glb_dbl_0dot49] |
fld [esp + loc44.dbl_R] |
fabs |
mc_CMP_ST0_ST1 |
jc .L5709 |
call TRandom_Ranf |
fld [glb_dbl_1dot2] |
faddp |
fld [esp + loc44.dbl_R] |
fmulp |
fstp [esp + loc44.dbl_R] |
; |
; Torpedo misfires |
; |
mov cl, ATTR_HIT_DAMAGE |
call TConsole_SetAttr |
cmp [esp + loc44.nN], 1 |
ja .L5706 |
mov ecx, 349 |
call TConsole_Prout |
jmp .L5707 |
.L5706: |
mov ecx, 350 |
call TConsole_Cram |
mcLoadLocal eax, loc44.nI |
call TConsole_CramInt |
mov ecx, 351 |
call TConsole_Prout |
mov eax, [esp + loc44.nI] |
cmp eax, [esp + loc44.nN] |
je .abort_burst |
mov ecx, 352 |
call TConsole_Prout |
.abort_burst: |
mcLoadLocal eax, loc44.nN |
mcStoreLocal loc44.nI, eax |
.L5707: |
call TRandom_Ranf |
fld [glb_dbl_0dot2] |
mc_CMP_ST0_ST1 |
jc .L5709 |
call TRandom_Ranf |
fld st |
faddp |
fld1 |
faddp |
mcLoadLocal esi, loc44.pTrekData |
fld [esi + TREKDATA.DAMFAC] |
fmulp |
mov cl, DEV_PHOTON_TUBES |
call TArray_SetDblDamage |
jmp KPHOTON.L115 |
.increase_deflection: |
fld [esp + loc44.dbl_R] |
fld [esi + TREKDATA.SHLD] |
fmulp |
fld [glb_dbl_0dot001] |
fmulp |
fld [esp + loc44.dbl_R] |
faddp |
fstp [esp + loc44.dbl_R] |
jmp .calc_AC |
.L5709: |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.QTORPS], 1 |
je .calc_quantum_R |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne .increase_deflection |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .increase_deflection |
jmp .calc_AC |
.calc_quantum_R: |
call TRandom_Ranf |
fld [glb_dbl_0dot15] |
fmulp |
fstp [esp + loc44.dbl_R] |
.calc_AC: |
mcLoadLocal ecx, loc44.nI |
dec ecx |
imul ecx, 10 |
mcLoadLocalRef edi, loc44.arr_COURSE |
fld [glb_dbl_DOCKFAC] |
fld [esp + loc44.dbl_R] |
fmulp |
fld tbyte [edi + ecx] |
faddp |
fstp [esp + loc44.dbl_AC] |
jmp KPHOTON.L5710 |
KPHOTON: |
; |
; Enemy fires photon torpedo! |
; |
mcBeginLocals loc44.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc44.pTrekData, esi |
movzx ecx, [esi + TREKDATA.KSHOT] |
dec ecx |
lea edi, [esi + TREKDATA.KY] |
add esi, TREKDATA.KX |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
mcStoreLocal loc44.byte_IX, al |
mcStoreLocal loc44.byte_IY, dl |
mcStoreLocal loc44.byte_STARTX, al |
mcStoreLocal loc44.byte_STARTY, dl |
mcLoad1 eax |
mcStoreLocal loc44.nI, eax |
mcStoreLocal loc44.nN, eax |
mcLoadLocal esi, loc44.pTrekData |
mov al, [esi + TREKDATA.SECTY] |
sub al, [esp + loc44.byte_STARTY] |
movsx eax, al |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTX] |
mov al, [esp + loc44.byte_STARTX] |
sub al, [esi + TREKDATA.SECTX] |
movsx eax, al |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTY] |
fld [esp + loc44.dbl_DELTX] |
fld [esp + loc44.dbl_DELTY] |
fpatan |
fld [glb_dbl_1dot90985932] |
fmulp |
fstp [esp + loc44.dbl_AC] |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
fsubp |
fstp [esp + loc44.dbl_TEMP] |
mcLoadLocal esi, loc44.pTrekData |
movzx ecx, [esi + TREKDATA.KSHOT] |
dec ecx |
imul ecx, 10 |
lea ebx, [esi + TREKDATA.KPOWER] |
fld tbyte [ebx + ecx] |
fld [glb_dbl_0dot001] |
fmulp |
fld1 |
faddp |
fld [esp + loc44.dbl_TEMP] |
fmulp |
call TRandom_Ranf |
fld [esp + loc44.dbl_TEMP] |
fmulp |
faddp |
fld st |
fstp [esp + loc44.dbl_R] |
fld [glb_dbl_DOCKFAC] |
fmulp |
fld [esp + loc44.dbl_AC] |
faddp |
fstp [esp + loc44.dbl_AC] |
call TConsole_SetGameMsgAttr |
mcLoadLocal al, loc44.byte_IX |
mcLoadLocal dl, loc44.byte_IY |
call TConsole_CramEnemyAtEx |
mov ecx, 354 |
call TConsole_Prout |
; |
; Check for klingon misfire |
; |
fld [glb_dbl_0dot45] |
fld [esp + loc44.dbl_TEMP] |
fabs |
mc_CMP_ST0_ST1 |
jc .L5710 |
; |
; Enemy torpedo misfired. Determine damage. |
; |
fld [glb_dbl_15] |
fld [esp + loc44.dbl_AC] |
fsubp |
fld [glb_dbl_0dot5235988] |
fmulp |
fstp [esp + loc44.dbl_ANGLE] |
call TRandom_Ranf |
fld [glb_dbl_600] |
fmulp |
fld [glb_dbl_200] |
faddp |
fstp [esp + loc44.dbl_HIT] |
mcLoadLocal esi, loc44.pTrekData |
movzx ecx, [esi + TREKDATA.KSHOT] |
mcStoreLocal loc44.nLL, ecx |
; |
; BUG FIX! Set these members as if torpedo hit him! |
; |
dec ecx |
movzx eax, [esi + ecx + TREKDATA.KX] |
movzx edx, [esi + ecx + TREKDATA.KY] |
mcStoreLocal loc44.torp_IX, eax |
mcStoreLocal loc44.torp_IY, edx |
call TArray_QuadPtr |
mov al, [ebx] |
mcStoreLocal loc44.ch_IQUAD, al |
mov ecx, 355 |
call TConsole_Prout |
jmp .L68 |
.L5710: |
fld [glb_dbl_15] |
fld [esp + loc44.dbl_AC] |
fsubp |
fld [glb_dbl_0dot5235988] |
fmulp |
fstp [esp + loc44.dbl_ANGLE] |
call TConsole_SetGameMsgAttr |
cmp [esp + loc44.nN], 1 |
je .L58 |
call TConsole_ScrollUp |
mov ecx, 356 |
call TConsole_Cram |
mcLoadLocal eax, loc44.nJ |
call TConsole_CramInt |
.L5720: |
mov ecx, 357 |
call TConsole_Cram |
jmp .L59 |
.L58: |
call TConsole_ScrollUp |
mov ecx, 358 |
call TConsole_Cram |
.L59: |
fld [esp + loc44.dbl_ANGLE] |
fld st |
fsin |
fchs |
fstp [esp + loc44.dbl_DELTAX] |
fcos |
fstp [esp + loc44.dbl_DELTAY] |
fld [esp + loc44.dbl_DELTAX] |
fabs |
fld [esp + loc44.dbl_DELTAY] |
fabs |
call TCommon_FPU_Max |
fstp [esp + loc44.dbl_BIGGER] |
fld [esp + loc44.dbl_DELTAX] |
fld [esp + loc44.dbl_BIGGER] |
fdivp |
fstp [esp + loc44.dbl_DELTAX] |
fld [esp + loc44.dbl_DELTAY] |
fld [esp + loc44.dbl_BIGGER] |
fdivp |
fstp [esp + loc44.dbl_DELTAY] |
mov al, [esp + loc44.byte_STARTX] |
call TCommon_LoadByteIntoFPU |
fstp [esp + loc44.dbl_X] |
mov al, [esp + loc44.byte_STARTY] |
call TCommon_LoadByteIntoFPU |
fstp [esp + loc44.dbl_Y] |
; |
; Begin inner loop for moving a single torpedo |
; |
mcZeroBits eax |
mcStoreLocal loc44.nL, eax |
.L5910: |
inc [esp + loc44.nL] |
; |
; X += DELTAX |
; |
fld [esp + loc44.dbl_X] |
fld [esp + loc44.dbl_DELTAX] |
faddp |
fld st |
fstp [esp + loc44.dbl_X] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc44.torp_IX, eax |
cmp eax, 1 |
jl .L105 |
cmp eax, 10 |
jg .L105 |
; |
; Y += DELTAY |
; |
fld [esp + loc44.dbl_Y] |
fld [esp + loc44.dbl_DELTAY] |
faddp |
fld st |
fstp [esp + loc44.dbl_Y] |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc44.torp_IY, eax |
cmp eax, 1 |
jl .L105 |
cmp eax, 10 |
jg .L105 |
; |
; Check if new line must be done in track. |
; |
cmp [esp + loc44.nL], 4 |
je .new_line |
cmp [esp + loc44.nL], 9 |
jne .print_track |
.new_line: |
call TConsole_ScrollUp |
.print_track: |
mov cl, 1 |
fld [esp + loc44.dbl_X] |
call TConsole_CramFloat |
mcLoad8bitsToReg32 ecx, 59 |
call TConsole_Cram |
mov cl, 1 |
fld [esp + loc44.dbl_Y] |
call TConsole_CramFloat |
mov cl, 3 |
call TConsole_RepeatBlank |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov al, [ebx] |
mcStoreLocal loc44.ch_IQUAD, al |
cmp al, CHAR_COSMOS |
je .L5910 |
call TConsole_ScrollUp |
invoke Sleep, 800 |
; |
; Begin hit checks. |
; |
movzx ecx, [esp + loc44.byte_STARTX] |
sub ecx, [esp + loc44.torp_IX] |
imul ecx, ecx |
movzx eax, [esp + loc44.byte_STARTY] |
sub eax, [esp + loc44.torp_IY] |
imul eax, eax |
add eax, ecx |
call TCommon_FPU_Load_EAX |
fsqrt |
fstp [esp + loc44.dbl_DIST] |
mov eax, [esp + loc44.torp_IY] |
movzx ecx, [esp + loc44.byte_STARTY] |
sub eax, ecx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTX] |
mov ecx, [esp + loc44.torp_IX] |
movzx eax, [esp + loc44.byte_STARTX] |
sub eax, ecx |
call TCommon_FPU_Load_EAX |
fld [glb_dbl_0dot1] |
fmulp |
fstp [esp + loc44.dbl_DELTY] |
; |
; BULSEYE |
; |
fld [esp + loc44.dbl_DELTX] |
fld [esp + loc44.dbl_DELTY] |
fpatan |
fld [glb_dbl_1dot90985932] |
fmulp |
fld [glb_dbl_15] |
fsubrp |
fld [glb_dbl_0dot5235988] |
fmulp |
fld [esp + loc44.dbl_ANGLE] |
fsubrp |
fsin |
fld st |
fstp [esp + loc44.dbl_SINANG] |
fabs |
fld [esp + loc44.dbl_DIST] |
fmulp |
fstp [esp + loc44.dbl_DISTN] |
; |
; HIT=(700.0 + 100*RANF(0)) - DISTN*1000.0 |
; |
call TRandom_Ranf |
fld [glb_dbl_100] |
fmulp |
fld [glb_dbl_700] |
faddp |
fld [esp + loc44.dbl_DISTN] |
fld [glb_dbl_1000] |
fmulp |
fsubp |
fstp [esp + loc44.dbl_HIT] |
; |
; Quantum warhead packs a punch! |
; |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.QTORPS], 1 |
jne .check_object_type |
cmp [esi + TREKDATA.KSHOT], 0 |
jne .check_object_type |
call TRandom_Ranf |
fld [glb_dbl_700] |
fmulp |
fld [glb_dbl_700] |
faddp |
fld [esp + loc44.dbl_HIT] |
faddp |
fstp [esp + loc44.dbl_HIT] |
; |
; Test for a type of object hit by torpedo |
; |
.check_object_type: |
mcLoadLocal al, loc44.ch_IQUAD |
mcOnRegEqu al, CHAR_KLINGON, .L62 |
mcOnRegEqu al, CHAR_ROMULAN, .L62 |
mcOnRegEqu al, CHAR_COMMANDER, .check_anti_photon |
mcOnRegEqu al, CHAR_SCOM, .check_anti_photon |
jmp .L70 |
.check_anti_photon: |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
mc_CMP_ST0_ST1 |
jc .L62 |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mcLoadLocal bl, loc44.ch_IQUAD |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAt |
mov ecx, 360 |
call TConsole_Prout |
mov ecx, 361 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L62: |
mcLoadLocal ebx, loc44.pTrekData |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
movzx ecx, [ebx + TREKDATA.NENHERE] |
mcZeroBits eax |
mcStoreLocal loc44.nLL, eax |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
.find_klingon: |
inc [esp + loc44.nLL] |
cmp al, [esi] |
jne .next_klingon |
cmp dl, [edi] |
je .L68 |
.next_klingon: |
inc esi |
inc edi |
loop .find_klingon |
;int 3 |
jmp .done |
.L68: |
mcLoadLocal ecx, loc44.nLL |
call TArray_KlingonPowerPtr |
mcStoreLocal loc44.pdbl_KPower, edx |
fld tbyte [edx] |
fstp [esp + loc44.dbl_KP] |
fld [esp + loc44.dbl_KP] |
fabs |
fld [esp + loc44.dbl_HIT] |
call TCommon_FPU_Min |
fld [esp + loc44.dbl_KP] |
call TCommon_FPU_SignAB |
fld [esp + loc44.dbl_KP] |
fsubrp |
mcLoadLocal edi, loc44.pdbl_KPower |
fld st |
fstp tbyte [edi] |
fldz |
mc_CMP_ST0_ST1 |
jnz .L69 |
mcLoadLocal ecx, loc44.nLL |
dec ecx |
mcLoadLocal ebx, loc44.pTrekData |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mov al, [esi + ecx] |
mov dl, [edi + ecx] |
call TPhasers_DeadKlingon |
jmp TPhotons_Main.L50 |
.L69: |
call TConsole_SetGameMsgAttr |
mov cl, 2 |
mcLoadLocal bl, loc44.ch_IQUAD |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAt |
.L6901: |
; |
; If enemy damaged, but not destroyed - try |
; to displace him. |
; |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
fsubp |
fld [glb_dbl_2dot5] |
fmulp |
fld [esp + loc44.dbl_ANGLE] |
faddp |
fstp [esp + loc44.dbl_ANG] |
fld [esp + loc44.dbl_ANG] |
fcos |
fabs |
fld [esp + loc44.dbl_ANG] |
fsin |
fabs |
call TCommon_FPU_Max |
fstp [esp + loc44.dbl_TEMP] |
fld [esp + loc44.dbl_ANG] |
fsin |
fchs |
fld [esp + loc44.dbl_TEMP] |
fdivp |
fstp [esp + loc44.dbl_X] |
fld [esp + loc44.dbl_ANG] |
fcos |
fld [esp + loc44.dbl_TEMP] |
fdivp |
fstp [esp + loc44.dbl_Y] |
; |
; Calculate JX,JY - sector of displacement. |
; |
fild [esp + loc44.torp_IX] |
fld [esp + loc44.dbl_X] |
faddp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc44.nJX, eax |
fild [esp + loc44.torp_IY] |
fld [esp + loc44.dbl_Y] |
faddp |
frndint |
call TCommon_FP_Truncate |
mcStoreLocal loc44.nJY, eax |
; |
; If displacement sector is out of quadrant range |
; then simply report that enemy is not yet destroyed. |
; |
cmp eax, 1 |
jl .L6905 |
cmp eax, 10 |
jg .L6905 |
mcLoadLocal eax, loc44.nJX |
cmp eax, 1 |
jl .L6905 |
cmp eax, 10 |
jg .L6905 |
; |
; Check if displaced into a black hole! |
; |
mcLoadLocal edx, loc44.nJY |
call TArray_QuadPtr |
mov al, [ebx] |
mcOnRegNotEqu al, CHAR_BLACK_HOLE, .L6903 |
; |
; Someone falls into a black hole! |
; |
mov ecx, 362 |
call TConsole_Prout |
mcLoadLocal esi, loc44.pTrekData |
mov al, [esi + TREKDATA.SHIP] |
cmp al, [esp + loc44.ch_IQUAD] |
jne .L6902 |
mov al, 21 |
call TFinish_Main |
jmp .done |
.L6902: |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TPhasers_DeadKlingon |
jmp TPhotons_Main.L50 |
.L6903: |
mcOnRegNotEqu al, CHAR_COSMOS, .L6905 |
; |
; Displace it! |
; |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
mcLoadLocal eax, loc44.nJX |
mcLoadLocal edx, loc44.nJY |
call TArray_QuadPtr |
mcLoadLocal al, loc44.ch_IQUAD |
mov [ebx], al |
mov ecx, 363 |
call TConsole_Prout |
mov ecx, 364 |
call TConsole_Cram |
mov cl, 2 |
mcLoadLocal eax, loc44.nJX |
mcLoadLocal edx, loc44.nJY |
call TConsole_CramLoc |
call TConsole_ScrollUp |
mcLoadLocal esi, loc44.pTrekData |
mov al, [esi + TREKDATA.SHIP] |
cmp al, [esp + loc44.ch_IQUAD] |
jne .L6904 |
; |
; Starship displaced by a torpedo. |
; Move it and reset enemy distances. |
; |
mcLoadLocal eax, loc44.nJX |
mcLoadLocal edx, loc44.nJY |
mov [esi + TREKDATA.SECTX], al |
mov [esi + TREKDATA.SECTY], dl |
.reset_distance: |
call TCommon_ResetDist |
jmp TPhotons_Main.L50 |
.L6904: |
; |
; Enemy displaced by photon blast! |
; |
mcLoadLocal ebx, loc44.pTrekData |
mcLoadLocal ecx, loc44.nLL |
dec ecx |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcLoadLocal eax, loc44.nJX |
mcLoadLocal edx, loc44.nJY |
mov [esi + ecx], al |
mov [edi + ecx], dl |
jmp .reset_distance |
.L6905: |
mov ecx, 365 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L70: |
cmp [esp + loc44.ch_IQUAD], CHAR_THOLIAN |
jne .L7002 |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAtEx |
fld [glb_dbl_600] |
fld [esp + loc44.dbl_HIT] |
mc_CMP_ST0_ST1 |
jc .L7001 |
mov ecx, 306 |
call TConsole_Prout |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
.cleanup_tholian: |
mcLoadLocal ebx, loc44.pTrekData |
mcZeroBits eax |
mcStoreMember TREKDATA.ITHERE, al |
mcStoreMember TREKDATA.ITHX, al |
mcStoreMember TREKDATA.ITHY, al |
jmp TPhotons_Main.L50 |
.L7001: |
fld [glb_dbl_0dot05] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jc .tholian_left |
.L7510: |
mov ecx, 366 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.tholian_left: |
mov ecx, 367 |
call TConsole_Prout |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_WEB |
mov al, CHAR_BLACK_HOLE |
call TCommon_DropIn |
jmp .cleanup_tholian |
.L7002: |
cmp [esp + loc44.ch_IQUAD], CHAR_WEB |
jne .L7005 |
mov ecx, 368 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L7005: |
cmp [esp + loc44.ch_IQUAD], CHAR_STARBASE |
jne .L75 |
; |
; Starbase hit! |
; |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAtEx |
fld [glb_dbl_600] |
fld [esp + loc44.dbl_HIT] |
mc_CMP_ST0_ST1 |
jc .L7510 |
mov ecx, 369 |
call TConsole_Cram |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.IPHWHO], 1 |
je .end_msg |
mov ecx, 370 |
call TConsole_Cram |
.end_msg: |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mcLoadLocal esi, loc44.pTrekData |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TArray_StarChartPtr |
add dword [ebx], 0 |
jns .clean_base |
mcZeroBits eax |
mov [ebx], eax |
.clean_base: |
mcLoadLocal ebx, loc44.pTrekData |
movzx ecx, [ebx + TREKDATA.REMBASE] |
mov al, [ebx + TREKDATA.QUADX] |
mov dl, [ebx + TREKDATA.QUADY] |
mcLoadMemberRef esi, TREKDATA.BASEQX |
mcLoadMemberRef edi, TREKDATA.BASEQY |
.check_base_quad: |
cmp al, [esi] |
jne .next_base |
cmp dl, [edi] |
jne .next_base |
jmp .L71 |
.next_base: |
inc esi |
inc edi |
loop .check_base_quad |
;int 3 |
jmp .done |
.L71: |
; |
; Replace the values at ESI,EDI with |
; the last base coordinates. |
; |
movzx ecx, [ebx + TREKDATA.REMBASE] |
dec ecx |
mcLoadMemberRef edx, TREKDATA.BASEQX |
mov al, [edx + ecx] |
mov [esi], al |
mcLoadMemberRef edx, TREKDATA.BASEQY |
mov al, [edx + ecx] |
mov [edi], al |
dec [ebx + TREKDATA.REMBASE] |
mov [ebx + TREKDATA.BASEX], 0 |
mov [ebx + TREKDATA.BASEY], 0 |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
call TArray_MyGalaxyPtr |
sub dword [ebx], 10 |
mcLoadLocal ebx, loc44.pTrekData |
cmp [ebx + TREKDATA.IPHWHO], 1 |
je .refresh_condition |
inc [ebx + TREKDATA.BASEKL] |
.refresh_condition: |
mov [ebx + TREKDATA.CONDIT], 0 |
call TCommon_NewCondition |
jmp TPhotons_Main.L50 |
.L75: |
cmp [esp + loc44.ch_IQUAD], CHAR_PLANET |
jne .L80 |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAtEx |
fld [glb_dbl_450] |
fld [esp + loc44.dbl_HIT] |
mc_CMP_ST0_ST1 |
jc .L7510 |
mov ecx, 306 |
call TConsole_Prout |
mcLoadLocal ebx, loc44.pTrekData |
cmp [ebx + TREKDATA.IPHWHO], 1 |
je .clean_planet |
inc [ebx + TREKDATA.NPLANKL] |
.clean_planet: |
call TArray_MyNewStufPtr |
dec byte [ebx] |
mcLoadLocal ebx, loc44.pTrekData |
movzx ecx, [ebx + TREKDATA.IPLANET] |
dec ecx |
imul ecx, TPlanet.size |
mcLoadMemberRef edi, TREKDATA.PLNETS |
add edi, ecx |
mcLoad8bitsToReg32 ecx, TPlanet.size |
mcZeroBits eax |
rep stosb |
mcStoreMember TREKDATA.IPLANET, al |
mcStoreMember TREKDATA.PLNETX, al |
mcStoreMember TREKDATA.PLNETY, al |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.LANDED], 1 |
jne TPhotons_Main.L50 |
mov al, 15 |
call TFinish_Main |
jmp .done |
.L80: |
cmp [esp + loc44.ch_IQUAD], CHAR_ASTERISK |
jne .L90 |
; |
; Check for Nova results... |
; |
fld [glb_dbl_270] |
fld [esp + loc44.dbl_HIT] |
mc_CMP_ST0_ST1 |
jnc .L85 |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAtEx |
mov ecx, 371 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L85: |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TNova_Main |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
je .done |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 0 |
jne .done |
jmp TPhotons_Main.L50 |
.L90: |
; |
; Check for a boomerang torpedo |
; |
mcLoadLocal esi, loc44.pTrekData |
mov al, [esi + TREKDATA.SHIP] |
cmp [esp + loc44.ch_IQUAD], al |
jne .L93 |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L9010 |
call TRandom_Ranf |
fld [glb_dbl_0dot77] |
mc_CMP_ST0_ST1 |
jc .L9010 |
call TConsole_SetGameMsgAttr |
mov ecx, 372 |
call TConsole_Cram |
call TConsole_CramShip |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
jmp TPhotons_Main.L50 |
.L9010: |
call TConsole_SetGameMsgAttr |
call TConsole_CramShip |
mov ecx, 373 |
call TConsole_Prout |
call TCommon_NewCondition |
mcLoadLocal esi, loc44.pTrekData |
movzx ecx, [esi + TREKDATA.KSHOT] |
mcLoadLocalRef esi, loc44.dbl_HIT |
mcLoadLocalRef edi, loc44.bIHURT |
call TAttack_Zap |
mcLoadLocal esi, loc44.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fldz |
mc_CMP_ST0_ST1 |
jc .L91 |
cmp [esi + TREKDATA.KSHOT], 0 |
jne .L9020 |
mov al, 22 |
jmp .call_finish |
.L9020: |
mov al, 5 |
jmp .call_finish |
.L91: |
fld [esp + loc44.dbl_HIT] |
call TAttack_Casualties |
; |
; Check to see if ship displaced |
; |
call TConsole_CramShip |
jmp .L6901 |
.L93: |
cmp [esp + loc44.ch_IQUAD], CHAR_THING |
jne .L95 |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 374 |
call TConsole_Prout |
mov ecx, 375 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 376 |
call TConsole_Prout |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TArray_QuadPtr |
mov byte [ebx], CHAR_COSMOS |
jmp TPhotons_Main.L50 |
.L95: |
; |
; Torpedo enters vicinity of a black hole. |
; Check for deflection. |
; |
mcLoadLocal eax, loc44.torp_IX |
mcLoadLocal edx, loc44.torp_IY |
call TConsole_CramEnemyAtEx |
fld [glb_dbl_0dot1] |
fld [esp + loc44.dbl_DISTN] |
mc_CMP_ST0_ST1 |
jc .L97 |
; |
; Torpedo deflected! |
; |
fld [glb_dbl_0dot5] |
fld [esp + loc44.dbl_DISTN] |
fsubp |
fld [glb_dbl_7dot853981634] |
fmulp |
fstp [esp + loc44.dbl_SPRANG] |
fld [glb_dbl_1dot57079633] |
fld [esp + loc44.dbl_ANGLE] |
faddp |
fld [esp + loc44.dbl_SPRANG] |
fsubp |
fstp [esp + loc44.dbl_BETA] |
fld [esp + loc44.dbl_DISTN] |
fld [esp + loc44.dbl_BETA] |
fsin |
fmulp |
fild [esp + loc44.torp_IX] |
fsubrp |
call TCommon_FP_Truncate |
mcStoreLocal loc44.byte_STARTX, al |
call TPhotons_IsValidSector |
jnc .L97 |
fld [esp + loc44.dbl_DISTN] |
fld [esp + loc44.dbl_BETA] |
fcos |
fmulp |
fild [esp + loc44.torp_IY] |
faddp |
call TCommon_FP_Truncate |
mcStoreLocal loc44.byte_STARTY, al |
call TPhotons_IsValidSector |
jnc .L97 |
fld [esp + loc44.dbl_SPRANG] |
fld [esp + loc44.dbl_SINANG] |
call TCommon_FPU_SignAB |
fld [esp + loc44.dbl_ANGLE] |
fsubrp |
fstp [esp + loc44.dbl_ANGLE] |
mov ecx, 378 |
call TConsole_Prout |
mov ecx, 379 |
call TConsole_Cram |
jmp .L5720 |
.L97: |
mov ecx, 377 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L105: |
; |
; End inner loop for moving one torpedo |
; |
call TConsole_ScrollUp |
.L106: |
mov ecx, 359 |
call TConsole_Prout |
jmp TPhotons_Main.L50 |
.L115: |
mcLoadLocal esi, loc44.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .finished |
call TCommon_SortKlingons |
jmp .done |
.finished: |
mov al, 1 |
.call_finish: |
call TFinish_Main |
.done: |
mcEndLocals loc44.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TPlanet.Asm |
---|
0,0 → 1,1069 |
; -------------------------------------------------------------------------- |
; FILE: TPlanet.Asm |
; DATE: November 4, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; STARS |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPlanet_Stars: |
mov ecx, 434 |
call TConsole_ProutGameMsg |
ret |
; -------------------------------------------------------------------------- |
; KABOOM |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc46: |
.pTrekData PVOID ? |
.dbl_WHAMMO DOUBLE ? |
.byte_IsKilled BYTE ? |
.byte_2 BYTE ? |
.pKPower PDOUBLE ? |
.pKDist PDOUBLE ? |
.pKX PBYTE ? |
.pKY PBYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPlanet_KaBoom: |
mcBeginLocals loc46.size |
call TPlanet_Stars |
mcLoadGameDataPtr esi |
mcStoreLocal loc46.pTrekData, esi |
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE |
jne .print |
call TConsole_Cram3Asterisks |
.print: |
mov ecx, 472 |
call TConsole_Cram |
call TConsole_CramShip |
mov ecx, 473 |
call TConsole_Prout |
call TPlanet_Stars |
call TConsole_ScrollUp |
mcLoadLocal esi, loc46.pTrekData |
cmp [esi + TREKDATA.NENHERE], 0 |
je .L20 |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_25] |
fmulp |
fstp [esp + loc46.dbl_WHAMMO] |
.outer_loop: |
mcLoadLocal ebx, loc46.pTrekData |
mcLoadMemberRef esi, TREKDATA.KX |
mcLoadMemberRef edi, TREKDATA.KY |
mcStoreLocal loc46.pKX, esi |
mcStoreLocal loc46.pKY, edi |
movzx ecx, [ebx + TREKDATA.NENHERE] |
jecxz .L20 |
mcLoadMemberRef esi, TREKDATA.KPOWER |
mcLoadMemberRef edi, TREKDATA.KDIST |
.check_whammo: |
fld tbyte [esi] |
fld tbyte [edi] |
fmulp |
fld [esp + loc46.dbl_WHAMMO] |
mc_CMP_ST0_ST1 |
jc .next_whammo |
mcLoadLocal esi, loc46.pKX |
mcLoadLocal edi, loc46.pKY |
mov al, [esi] |
mov dl, [edi] |
call TPhasers_DeadKlingon |
invoke Sleep, 500 |
jmp .outer_loop |
.next_whammo: |
inc [esp + loc46.pKX] |
inc [esp + loc46.pKY] |
add esi, 10 |
add edi, 10 |
loop .check_whammo |
.L20: |
mov al, 10 |
call TFinish_Main |
mcEndLocals loc46.size |
ret |
; -------------------------------------------------------------------------- |
; PLANET |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc45: |
.pTrekData PVOID ? |
.pIWHERE PVOID ? |
.bHasDilithium BOOL ? |
.nPlanetClass INT32 ? |
.dbl_DAMAGE_10 DOUBLE ? |
.byte_1 BYTE ? |
.byte_2 BYTE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TPlanet_Main: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
movzx ecx, [esi + TREKDATA.INPLAN] |
lea edi, [esi + TREKDATA.PLNETS] |
mcZeroBits eax |
.check_planet_info: |
add al, [edi + TPlanet.planet_SCANNED] |
add edi, TPlanet.size |
loop .check_planet_info |
mcOnRegNotZero eax, .L102 |
mov ecx, 380 |
call TConsole_Prout |
.exit_main: |
mcEndLocals loc45.size |
ret |
.L102: |
mov ecx, 381 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoadLocal esi, loc45.pTrekData |
movzx ecx, [esi + TREKDATA.INPLAN] |
lea edi, [esi + TREKDATA.PLNETS] |
.planet_report: |
cmp [edi + TPlanet.planet_SCANNED], 0 |
je .next_planet |
push ecx edi |
mov al, [edi + TPlanet.planet_X] |
mov dl, [edi + TPlanet.planet_Y] |
mov cl, 1 |
call TConsole_CramLoc |
mov ecx, 382 |
call TConsole_Cram |
pop edi ecx |
mov al, 'L' |
add al, [edi + TPlanet.planet_CLASS] |
push ecx edi |
call TConsole_PutChar |
pop edi ecx |
push ecx edi |
mov ecx, 383 |
movzx eax, [edi + TPlanet.planet_DILITHIUM] |
add ecx, eax |
call TConsole_Cram |
mov ecx, 385 |
call TConsole_Prout |
pop edi ecx |
.next_planet: |
add edi, TPlanet.size |
loop .planet_report |
jmp .exit_main |
; -------------------------------------------------------------------------- |
; ORBIT |
; -------------------------------------------------------------------------- |
TPlanet_Orbit: |
mcBeginLocals loc45.size |
call TConsole_ScrollUp |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
cmp [esi + TREKDATA.INORBIT], 0 |
je .L2 |
call TConsole_SetGameMsgAttr |
mov ecx, 386 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L2: |
mov cl, DEV_IMPULSE_ENGINES |
call TArray_IsDamaged |
jnc .L3 |
mov cl, DEV_WARP_ENGINES |
call TArray_IsDamaged |
jnc .L3 |
call TConsole_SetGameMsgAttr |
mov ecx, 387 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L3: |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.PLNETX], 0 |
je .L5 |
mov al, [esi + TREKDATA.SECTX] |
sub al, [esi + TREKDATA.PLNETX] |
movsx eax, al |
call TCommon_AbsEAX |
push eax |
mov al, [esi + TREKDATA.SECTY] |
sub al, [esi + TREKDATA.PLNETY] |
movsx eax, al |
call TCommon_AbsEAX |
pop edx |
add eax, edx |
cmp eax, 2 |
jbe .L10 |
.L5: |
call TConsole_SetGameMsgAttr |
call TConsole_CramShip |
mov ecx, 388 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L10: |
call TRandom_Ranf |
fld [glb_dbl_0dot03] |
fmulp |
fld [glb_dbl_0dot02] |
faddp |
mcLoadLocal edi, loc45.pTrekData |
fstp [edi + TREKDATA.TIME] |
mov cl, DEV_WARP_ENGINES |
call TArray_IsDamaged |
jnc .go_ahead_sulu |
mcLoadLocal edi, loc45.pTrekData |
fld [edi + TREKDATA.TIME] |
fld [glb_dbl_Ten] |
fmulp |
fstp [edi + TREKDATA.TIME] |
.go_ahead_sulu: |
call TConsole_SetCrewMsgAttr |
mov ecx, 389 |
call TConsole_Prout |
call TCommon_NewCondition |
mov eax, .L17 |
mcStoreLocal loc45.pIWHERE, eax |
.L16: |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.IDIDIT], 1 |
call TEvents_Main |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.ALLDONE], 1 |
je TPlanet_Main.exit_main |
cmp [esi + TREKDATA.JUSTIN], 1 |
je TPlanet_Main.exit_main |
call TArray_MyGalaxyPtr |
cmp dword [ebx], 1000 |
je TPlanet_Main.exit_main |
jmp [esp + loc45.pIWHERE] |
.L17: |
mov ecx, 390 |
call TConsole_Cram |
call TRandom_Ranf |
fld [glb_dbl_7200] |
fmulp |
fld [glb_dbl_1400] |
faddp |
fld st |
mcLoadLocal edi, loc45.pTrekData |
fstp [edi + TREKDATA.HEIGHT] |
mov cl, 2 |
call TConsole_CramFloat |
mov ecx, 391 |
call TConsole_Prout |
mcLoadLocal edi, loc45.pTrekData |
inc [edi + TREKDATA.INORBIT] |
jmp TPlanet_Main.exit_main |
; -------------------------------------------------------------------------- |
; BEAM |
; -------------------------------------------------------------------------- |
TPlanet_Beam: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
call TConsole_ScrollUp |
mov cl, DEV_TRANSPORTER |
call TArray_IsDamaged |
jnc .L19 |
call TConsole_SetGameMsgAttr |
mov ecx, 392 |
call TConsole_Prout |
mov cl, DEV_SHUTTLE_CRAFT |
call TArray_GetDblDamage |
fldz |
mc_CMP_ST0_ST1 |
jnz TPlanet_Main.exit_main |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 393 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L19: |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.INORBIT], 0 |
jne .L1910 |
.L1901: |
call TConsole_SetGameMsgAttr |
call TConsole_CramShip |
mov ecx, 394 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L1910: |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L1920 |
call TConsole_SetGameMsgAttr |
mov ecx, 395 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L1920: |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
movzx eax, [edi + TPlanet.planet_DILITHIUM] |
mcStoreLocal loc45.bHasDilithium, eax |
cmp [edi + TPlanet.planet_SCANNED], 1 |
je .L1940 |
.L1930: |
call TConsole_SetCrewMsgAttr |
mov ecx, 396 |
call TConsole_Prout |
mov ecx, 397 |
call TConsole_Prout |
mov ecx, 398 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L1940: |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.LANDED], 1 |
je .L30 |
cmp [esp + loc45.bHasDilithium], 1 |
je .L20 |
call TConsole_SetCrewMsgAttr |
mov ecx, 399 |
call TConsole_Prout |
mov ecx, 400 |
call TConsole_Prout |
mov eax, .L20 |
mcStoreLocal loc45.pIWHERE, eax |
.L1950: |
mcLoad8bitsToReg32 ecx, 158 |
call TGame_JA |
jnc TPlanet_Main.exit_main |
jmp [esp + loc45.pIWHERE] |
.L20: |
call TConsole_SetCrewMsgAttr |
mov ecx, 401 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 402 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 403 |
call TConsole_Prout |
.L21: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mov ecx, 404 |
call TConsole_Prout |
invoke Sleep, 1200 |
fld [glb_dbl_0dot98] |
call TRandom_Ranf |
mc_CMP_ST0_ST1 |
jnc .L35 |
mov ecx, 405 |
call TConsole_Prout |
invoke Sleep, 1200 |
mov ecx, 406 |
call TConsole_Prout |
mcLoadLocal esi, loc45.pTrekData |
neg [esi + TREKDATA.LANDED] |
cmp [esi + TREKDATA.LANDED], 1 |
je .reset_mining_flag |
cmp [esi + TREKDATA.IMINE], 1 |
jne .reset_mining_flag |
mov [esi + TREKDATA.ICRYSTL], 1 |
.reset_mining_flag: |
mov [esi + TREKDATA.IMINE], 0 |
jmp TPlanet_Main.exit_main |
.L30: |
cmp [esi + TREKDATA.ISCRAFT], 1 |
je .L32 |
call TConsole_SetGameMsgAttr |
mov ecx, 407 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L32: |
call TConsole_SetGameMsgAttr |
mov ecx, 408 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 409 |
call TConsole_Prout |
mov ecx, 410 |
call TConsole_Prout |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 411 |
call TConsole_Prout |
jmp .L21 |
.L35: |
call TConsole_ScrollUp |
mov ecx, 412 |
call TConsole_Prout |
call TConsole_SetCrewMsgAttr |
call TConsole_ScrollUp |
mov ecx, 413 |
call TConsole_Prout |
mov al, 13 |
.finished: |
call TFinish_Main |
jmp TPlanet_Main.exit_main |
; -------------------------------------------------------------------------- |
; MINE |
; -------------------------------------------------------------------------- |
TPlanet_Mine: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
call TConsole_ScrollUp |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.LANDED], 1 |
je .L50 |
call TConsole_SetGameMsgAttr |
mov ecx, 414 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L50: |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
movzx eax, [edi + TPlanet.planet_CLASS] |
mcStoreLocal loc45.nPlanetClass, eax |
cmp [edi + TPlanet.planet_DILITHIUM], 1 |
je .L51 |
call TConsole_SetGameMsgAttr |
mov ecx, 415 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L51: |
call TRandom_Ranf |
fld [glb_dbl_0dot2] |
fmulp |
fld [glb_dbl_0dot1] |
faddp |
fild [esp + loc45.nPlanetClass] |
fmulp |
mcLoadLocal esi, loc45.pTrekData |
fstp [esi + TREKDATA.TIME] |
mov eax, .L52 |
mcStoreLocal loc45.pIWHERE, eax |
jmp TPlanet_Orbit.L16 |
.L52: |
invoke Sleep, 1200 |
call TConsole_SetGameMsgAttr |
mov ecx, 416 |
call TConsole_Prout |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.IMINE], 1 |
jmp TPlanet_Main.exit_main |
; -------------------------------------------------------------------------- |
; CRYSTAL |
; -------------------------------------------------------------------------- |
TPlanet_Crystal: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
call TConsole_ScrollUp |
mcLoadLocal edi, loc45.pTrekData |
cmp [edi + TREKDATA.ICRYSTL], 1 |
je .L55 |
call TConsole_SetGameMsgAttr |
mov ecx, 417 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L55: |
fld [glb_dbl_1000] |
fld [edi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L5510 |
call TConsole_SetCrewMsgAttr |
mov ecx, 418 |
call TConsole_Prout |
mov ecx, 419 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L5510: |
call TConsole_SetCrewMsgAttr |
mov ecx, 420 |
call TConsole_Prout |
mov ecx, 421 |
call TConsole_Prout |
mov ecx, 422 |
call TConsole_Prout |
mov eax, .L56 |
mcStoreLocal loc45.pIWHERE, eax |
jmp TPlanet_Beam.L1950 |
.L56: |
call TConsole_SetCrewMsgAttr |
call TConsole_ScrollUp |
mov ecx, 423 |
call TConsole_Prout |
mov ecx, 424 |
call TConsole_Prout |
invoke Sleep, 1200 |
mcLoadLocal edi, loc45.pTrekData |
fld [edi + TREKDATA.CRYPROB] |
fld st |
faddp |
fstp [edi + TREKDATA.CRYPROB] |
call TConsole_ScrollUp |
mov ecx, 425 |
call TConsole_Prout |
mov ecx, 426 |
call TConsole_Prout |
invoke Sleep, 1200 |
call TConsole_ScrollUp |
mov ecx, 427 |
call TConsole_Prout |
call TConsole_ScrollUp |
invoke Sleep, 1200 |
call TRandom_Ranf |
mcLoadLocal esi, loc45.pTrekData |
fld [esi + TREKDATA.CRYPROB] |
mc_CMP_ST0_ST1 |
jc .L57 |
call TConsole_SetCrewMsgAttr |
mov ecx, 428 |
call TConsole_Prout |
.L5610: |
mov cl, ATTR_COND_RED |
call TConsole_SetAttr |
mov ecx, 429 |
call TConsole_Prout |
call TPlanet_Stars |
mov ecx, 430 |
call TConsole_Prout |
call TPlanet_KaBoom |
jmp TPlanet_Main.exit_main |
.L57: |
call TRandom_Ranf |
fld [glb_dbl_0dot9] |
fmulp |
fld1 |
faddp |
fld [glb_dbl_5000] |
fmulp |
mcLoadLocal esi, loc45.pTrekData |
fld [esi + TREKDATA.ENERGY] |
faddp |
fstp [esi + TREKDATA.ENERGY] |
call TConsole_SetCrewMsgAttr |
mov ecx, 431 |
call TConsole_Prout |
mov ecx, 432 |
call TConsole_Prout |
mov ecx, 433 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
; -------------------------------------------------------------------------- |
; SENSOR |
; -------------------------------------------------------------------------- |
TPlanet_Sensor: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
call TConsole_ScrollUp |
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
jnc .L60 |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L60 |
call TConsole_SetGameMsgAttr |
mov ecx, 435 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L60: |
cmp [esi + TREKDATA.PLNETX], 0 |
jne .L65 |
call TConsole_SetGameMsgAttr |
mov ecx, 436 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
.L65: |
call TConsole_SetCrewMsgAttr |
mov ecx, 437 |
call TConsole_Cram |
mcLoadLocal esi, loc45.pTrekData |
mov cl, 1 |
mov al, [esi + TREKDATA.QUADX] |
mov dl, [esi + TREKDATA.QUADY] |
call TConsole_CramLoc |
mov al, ':' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mov ecx, 438 |
call TConsole_Cram |
mcLoadLocal esi, loc45.pTrekData |
mov cl, 2 |
mov al, [esi + TREKDATA.PLNETX] |
mov dl, [esi + TREKDATA.PLNETY] |
call TConsole_CramLoc |
mov ecx, 439 |
call TConsole_Cram |
mcLoadLocal esi, loc45.pTrekData |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
mov [edi + TPlanet.planet_SCANNED], 1 |
mov al, [edi + TPlanet.planet_DILITHIUM] |
push eax |
mov al, [edi + TPlanet.planet_CLASS] |
add al, 'L' |
call TConsole_PutChar |
mov al, '`' |
call TConsole_PutChar |
mov al, '.' |
call TConsole_PutChar |
call TConsole_ScrollUp |
mov ecx, 440 |
call TConsole_Cram |
pop eax |
mcOnRegNotZero al, .report |
mov ecx, 441 |
call TConsole_Cram |
.report: |
mov ecx, 442 |
call TConsole_Prout |
jmp TPlanet_Main.exit_main |
; -------------------------------------------------------------------------- |
; GALILEO |
; -------------------------------------------------------------------------- |
TPlanet_Galileo: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
call TConsole_ScrollUp |
mov cl, DEV_SHUTTLE_CRAFT |
call TArray_GetDblDamage |
fld st |
fstp [esp + loc45.dbl_DAMAGE_10] |
fldz |
mc_CMP_ST0_ST1 |
jz .L72 |
jc .L71 |
fld1 |
fchs |
mc_CMP_ST0_ST1 |
jz .L70 |
mov ecx, 443 |
call TConsole_ProutGameMsg |
jmp TPlanet_Main.exit_main |
.L70: |
mov ecx, 444 |
call TConsole_ProutGameMsg |
jmp TPlanet_Main.exit_main |
.L71: |
mov ecx, 445 |
call TConsole_ProutGameMsg |
jmp TPlanet_Main.exit_main |
.L72: |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.INORBIT], 1 |
jne TPlanet_Beam.L1901 |
cmp [esi + TREKDATA.SHLDUP], 1 |
je .craft_cant_thru_shields |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L80 |
.craft_cant_thru_shields: |
mov ecx, 446 |
call TConsole_ProutGameMsg |
jmp TPlanet_Main.exit_main |
.L80: |
movzx ecx, [esi + TREKDATA.IPLANET] |
call TArray_PlanetPtr |
cmp [edi + TPlanet.planet_SCANNED], 1 |
jne TPlanet_Beam.L1930 |
mcLoadLocal esi, loc45.pTrekData |
fld [esi + TREKDATA.HEIGHT] |
fld [glb_dbl_3E_neg_5] |
fmulp |
fstp [esi + TREKDATA.TIME] |
cmp [esi + TREKDATA.LANDED], 1 |
jne .L100 |
cmp [esi + TREKDATA.ISCRAFT], 1 |
jne .L98 |
mov cl, DEV_TRANSPORTER |
call TArray_IsDamaged |
jc .L95 |
call TConsole_SetCrewMsgAttr |
mov ecx, 447 |
call TConsole_Prout |
mov ecx, 458 |
call TGame_JA |
jc TPlanet_Main.exit_main |
.L95: |
call TConsole_SetGameMsgAttr |
mov cl, DEV_TRANSPORTER |
call TArray_IsDamaged |
mov ecx, 448 |
adc ecx, 0 |
call TConsole_Cram |
mov ecx, 450 |
call TConsole_Prout |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.ISCRAFT], 0 |
mov eax, .L97 |
mcStoreLocal loc45.pIWHERE, eax |
.L96: |
call TConsole_ScrollUp |
jmp TPlanet_Orbit.L16 |
.L97: |
mov ecx, 451 |
call TConsole_ProutGameMsg |
jmp TPlanet_Main.exit_main |
.L98: |
mov ecx, 452 |
call TConsole_ProutGameMsg |
mov ecx, 453 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 454 |
call TConsole_Prout |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.ICRAFT], 1 |
mov [edi + TREKDATA.LANDED], -1 |
mov eax, .L99 |
mcStoreLocal loc45.pIWHERE, eax |
jmp .L96 |
.L99: |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.ICRAFT], 0 |
mov [edi + TREKDATA.ISCRAFT], 1 |
cmp [edi + TREKDATA.IMINE], 0 |
je .L97 |
mov [edi + TREKDATA.ICRYSTL], 1 |
mov [edi + TREKDATA.IMINE], 0 |
jmp .L97 |
.L100: |
mov ecx, 455 |
call TConsole_ProutGameMsg |
mov ecx, 456 |
call TConsole_Prout |
call TConsole_ScrollUp |
mov ecx, 457 |
call TConsole_Prout |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.ICRAFT], 1 |
mov [edi + TREKDATA.ISCRAFT], 0 |
mov eax, .L110 |
mcStoreLocal loc45.pIWHERE, eax |
jmp .L96 |
.L110: |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.LANDED], 1 |
mov [edi + TREKDATA.ICRAFT], 0 |
jmp .L97 |
; -------------------------------------------------------------------------- |
; DEATHRA |
; -------------------------------------------------------------------------- |
TPlanet_DeathRay: |
mcBeginLocals loc45.size |
mcLoadGameDataPtr esi |
mcStoreLocal loc45.pTrekData, esi |
mov [esi + TREKDATA.IDIDIT], 0 |
call TConsole_ScrollUp |
cmp [esi + TREKDATA.SHIP], CHAR_ENTERPRISE |
je .L113 |
mov ecx, 459 |
call TConsole_ProutGameMsg |
jmp .done |
.L113: |
cmp [esi + TREKDATA.NENHERE], 1 |
jae .L115 |
call TConsole_SetCrewMsgAttr |
mov ecx, 460 |
call TConsole_Prout |
jmp .done |
.L115: |
mov cl, DEV_DEATHRAY |
call TArray_IsDamaged |
jnc .L116 |
mov ecx, 461 |
call TConsole_ProutGameMsg |
jmp .done |
.L116: |
mcLoadLocal edi, loc45.pTrekData |
mov [edi + TREKDATA.IDIDIT], 1 |
call TConsole_SetCrewMsgAttr |
mov ecx, 462 |
call TConsole_Prout |
call TConsole_ScrollUp |
invoke Sleep, 1600 |
mov ecx, 463 |
call TConsole_Prout |
invoke Sleep, 1000 |
mov ecx, 464 |
call TConsole_Prout |
call TConsole_ScrollUp |
invoke Sleep, 1200 |
mov ecx, 465 |
call TConsole_ProutGameMsg |
invoke Sleep, 1200 |
call TConsole_SetCrewMsgAttr |
mov ecx, 466 |
call TConsole_Prout |
invoke Sleep, 1200 |
call TRandom_Ranf |
fld [glb_dbl_0dot3] |
mc_CMP_ST0_ST1 |
jc .L130 |
call TMove_RedAlert |
mov ecx, 467 |
call TConsole_ProutGameMsg |
invoke Sleep, 1200 |
jmp TPlanet_Crystal.L5610 |
.L130: |
call TConsole_ScrollUp |
mcLoadLocal edx, loc45.pTrekData |
movzx ecx, [edx + TREKDATA.NENHERE] |
lea esi, [edx + TREKDATA.KX] |
lea edi, [edx + TREKDATA.KY] |
.next_enemy: |
push edi esi ecx |
mov al, [esi] |
mov dl, [edi] |
call TPhasers_DeadKlingon |
pop ecx esi edi |
loop .next_enemy |
call TConsole_ScrollUp |
call TConsole_SetCrewMsgAttr |
mov ecx, 468 |
call TConsole_Prout |
mcLoadLocal esi, loc45.pTrekData |
cmp [esi + TREKDATA.REMKL], 0 |
je .game_won |
call TConsole_ScrollUp |
mov ecx, 469 |
call TConsole_Prout |
call TRandom_Ranf |
fld [glb_dbl_0dot05] |
mc_CMP_ST0_ST1 |
jc .deathray_damaged |
mov ecx, 470 |
call TConsole_Prout |
jmp .done |
.deathray_damaged: |
mov ecx, 471 |
call TConsole_Prout |
mov cl, DEV_DEATHRAY |
fld [glb_dbl_39dot95] |
call TArray_SetDblDamage |
jmp .done |
.game_won: |
mov al, 1 |
jmp TPlanet_Beam.finished |
.done: |
mcEndLocals loc45.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TRandom.Asm |
---|
0,0 → 1,324 |
; -------------------------------------------------------------------------- |
; FILE: TRandom.Asm |
; DATE: October 4, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_Create: |
invoke HeapAlloc, [glb_Allocator], HEAP_NO_SERIALIZE, TRandom.size |
mov [glb_pMersenne], eax |
mcZeroBits ecx |
mov [eax + TRandom.rand_NextIndex], ecx |
rdtsc |
call TRandom_Seed |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = seed value |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc7: |
.index INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_Seed: |
mcBeginLocals loc7.size |
mcLoad1 ecx |
mcStoreLocal loc7.index, ecx |
mov edi, [glb_pMersenne] |
stosd |
.set_next_value: |
; |
; MT [i-1] |
; |
mov edx, [edi - 4] |
; |
; Right shift by 30 bits |
; |
mov eax, edx |
shr eax, 30 |
; |
; XOR it with MT [i-1] |
; |
xor edx, eax |
; |
; Add current index |
; |
add edx, [esp + loc7.index] |
; |
; Multiply by 6C078965h |
; |
mov eax, 6C078965h |
mul edx |
; |
; Store as MT [i] |
; |
stosd |
; |
; Continue until index reaches 623 |
; |
inc [esp + loc7.index] |
cmp [esp + loc7.index], 623 |
jbe .set_next_value |
mcEndLocals loc7.size |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = value |
; Output: |
; EAX = value MOD 624 |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_GetModulo624: |
push ecx edx |
mcZeroBits edx |
mov ecx, 624 |
div ecx |
mov eax, edx |
pop edx ecx |
ret |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc8: |
.index INDEX ? |
.y UINT32 ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_Generate624: |
mcBeginLocals loc8.size |
; |
; i=0 |
; |
mcZeroBits eax |
mcStoreLocal loc8.index, eax |
; |
; MT array |
; |
mov esi, [glb_pMersenne] |
.calc_y: |
; |
; MT [(i+1) MOD 624] |
; |
mcLoadLocal eax, loc8.index |
inc eax |
call TRandom_GetModulo624 |
mov ecx, [esi + eax*4] |
; |
; Get last 31 bits of ECX |
; |
and ecx, 7FFFFFFFh |
; |
; 32nd bit of MT [i] |
; |
mcLoadLocal eax, loc8.index |
mov edx, [esi + eax*4] |
and edx, 80000000h |
; |
; Combine them and store as Y |
; |
or edx, ecx |
mcStoreLocal loc8.y, edx |
; |
; MT [i] = MT [(i+397) MOD 624] xor (y >> 1) |
; |
mcLoadLocal eax, loc8.index |
add eax, 397 |
call TRandom_GetModulo624 |
mov ecx, [esi + eax*4] |
shr edx, 1 |
xor ecx, edx |
mcLoadLocal eax, loc8.index |
mov [esi + eax*4], ecx |
; |
; IF ((Y MOD 2) == 1) THEN MT [i] ^= 9908B0DFh |
; |
test [esp + loc8.y], 1 |
jz .continue |
xor dword [esi + eax*4], 9908B0DFh |
.continue: |
inc [esp + loc8.index] |
cmp [esp + loc8.index], 623 |
jbe .calc_y |
mcEndLocals loc8.size |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EAX = next random value from a sequence |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_GetNextNumber: |
push ebx |
mov ebx, [glb_pMersenne] |
; |
; IF (index == 0) THEN generate next 624 values |
; |
cmp [ebx + TRandom.rand_NextIndex], 0 |
jne .get_it |
push esi |
call TRandom_Generate624 |
pop esi |
mov ebx, [glb_pMersenne] |
.get_it: |
mcLoadMember ecx, TRandom.rand_NextIndex |
mov eax, [ebx + ecx*4] |
mov edx, eax |
shr edx, 11 |
xor eax, edx |
mov edx, eax |
shl edx, 7 |
and edx, 9D2C5680h |
xor eax, edx |
mov edx, eax |
shl edx, 15 |
and edx, 0EFC60000h |
xor eax, edx |
mov edx, eax |
shr edx, 18 |
xor eax, edx |
; |
; Index = (Index+1) MOD 624 |
; |
push eax |
mov eax, ecx |
call TRandom_GetModulo624 |
mcStoreMember TRandom.rand_NextIndex, eax |
pop eax |
pop ebx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EDX = N |
; Output: |
; EAX = random value in range [0..N-1] |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_IRan: |
push edx |
call TRandom_GetNextNumber |
mcZeroBits edx |
pop ecx |
div ecx |
mov eax, edx |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; ST(0) = random value in range [0..1] |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc9: |
.dbl_2e31 DOUBLE ? |
.dbl_padded DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_Ranf: |
pushad |
mcBeginLocals loc9.size |
fldz |
fstp [esp + loc9.dbl_2e31] |
call TRandom_GetNextNumber |
test eax, 80000000h |
jz .add_two_parts |
fld [glb_dbl_2e31] |
fstp [esp + loc9.dbl_2e31] |
and eax, 7FFFFFFFh |
.add_two_parts: |
call TCommon_FPU_Load_EAX |
fld [esp + loc9.dbl_2e31] |
faddp |
fld [glb_dbl_2e32] |
fdivp |
mcEndLocals loc9.size |
popad |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EAX = value 1 or 10 (X,Y sector of Tholian!) |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_TholianSect: |
call TRandom_Ranf |
fld [glb_dbl_0dot5] |
faddp |
call TCommon_FP_Truncate |
imul eax, 9 |
inc eax |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EAX = random X value in range [1..8] |
; EDX = random Y value in range [1..8] |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_IRan8: |
mcLoad8bitsToReg32 edx, 8 |
call TRandom_IRan |
inc eax |
push eax |
mcLoad8bitsToReg32 edx, 8 |
call TRandom_IRan |
inc eax |
mov edx, eax |
pop eax |
ret |
; -------------------------------------------------------------------------- |
; Output: |
; EAX = random X value in range [1..10] |
; EDX = random Y value in range [1..10] |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TRandom_IRan10: |
mcLoad8bitsToReg32 edx, 10 |
call TRandom_IRan |
inc eax |
push eax |
mcLoad8bitsToReg32 edx, 10 |
call TRandom_IRan |
inc eax |
mov edx, eax |
pop eax |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TRandom.Inc |
---|
0,0 → 1,13 |
; -------------------------------------------------------------------------- |
; FILE: TRandom.Inc |
; DATE: October 4, 2008 |
; -------------------------------------------------------------------------- |
virtual at 0 |
TRandom: |
.rand_NumberSet INTEGERS 624 |
.rand_NextIndex INT32 ? |
.size = $ |
end virtual |
; --- EOF --- |
/programs/games/StarTrek/trunk/TShields.Asm |
---|
0,0 → 1,314 |
; -------------------------------------------------------------------------- |
; FILE: TShields.Asm |
; DATE: October 18, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; SHIELDS |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc35: |
.pTrekData PVOID ? |
.dbl_ETRANS DOUBLE ? |
.dbl_reserved DOUBLE ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TShields_Main: |
mcBeginLocals loc35.size |
mcLoadGameDataPtr ebx |
mcStoreLocal loc35.pTrekData, ebx |
mov [ebx + TREKDATA.IDIDIT], 0 |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
jne TShields_Up.L30 |
.L15: |
mcLoad8bitsToReg32 ecx, 225 |
call TGame_JA |
jc TShields_Up.L8010 |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jc TShields_Up.L60 |
mcLoadLocal esi, loc35.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne TShields_Up.L20 |
jmp TShields_Up.ENTRY |
; -------------------------------------------------------------------------- |
; SHLDSUP |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TShields_Up: |
mcBeginLocals loc35.size |
mcLoadGameDataPtr ebx |
mcStoreLocal loc35.pTrekData, ebx |
.ENTRY: |
mcLoad8bitsToReg32 ecx, 226 |
call TGame_JA |
jc .L40 |
jmp .L90 |
.L20: |
mcLoad8bitsToReg32 ecx, 227 |
call TGame_JA |
jc .L50 |
jmp .L90 |
.L30: |
mcLoad8bitsToReg32 ecx, 244 |
call TCmdBuf_Crop |
jc .L80 |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jc .L60 |
mcLoad8bitsToReg32 ecx, 245 |
call TCmdBuf_Crop |
jc .L40 |
mcLoad8bitsToReg32 ecx, 246 |
call TCmdBuf_Crop |
jc .L50 |
jmp TShields_Main.L15 |
.L40: |
; |
; Raising shields |
; |
mcLoadLocal esi, loc35.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
jne .L45 |
mov [esi + TREKDATA.SHLDUP], 1 |
mov [esi + TREKDATA.SHLDCHG], 1 |
cmp [esi + TREKDATA.CONDIT], CONDITION_DOCKED |
je .L401 |
fld [esi + TREKDATA.ENERGY] |
fld [glb_dbl_50] |
fsubp |
fstp [esi + TREKDATA.ENERGY] |
.L401: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 228 |
call TConsole_Prout |
mcLoadLocal esi, loc35.pTrekData |
fldz |
fld [esi + TREKDATA.ENERGY] |
mc_CMP_ST0_ST1 |
jc .L70 |
.did_it: |
mcLoadLocal edi, loc35.pTrekData |
inc [edi + TREKDATA.IDIDIT] |
jmp .done |
.L45: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 230 |
call TConsole_Prout |
jmp .done |
.L50: |
; |
; Lowering shields |
; |
mcLoadLocal esi, loc35.pTrekData |
cmp [esi + TREKDATA.SHLDUP], 0 |
je .L55 |
dec [esi + TREKDATA.SHLDUP] |
mov [esi + TREKDATA.SHLDCHG], 1 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 229 |
call TConsole_Prout |
jmp .did_it |
.L55: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 231 |
call TConsole_Prout |
jmp .done |
.L60: |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 232 |
call TConsole_Prout |
jmp .done |
.L70: |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 233 |
call TConsole_Prout |
mov al, 4 |
call TFinish_Main |
jmp .done |
.L80: |
call TCmdBuf_Scan |
fld [ebx + TCmdBuf.cmdbuf_FNUM] |
fstp [esp + loc35.dbl_ETRANS] |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_REAL |
je .L81 |
.L8010: |
mcLoad8bitsToReg32 ecx, 234 |
call TGame_Prompt |
jmp .L80 |
.L81: |
fld [esp + loc35.dbl_ETRANS] |
fldz |
mc_CMP_ST0_ST1 |
jz .L90 |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc35.dbl_ETRANS] |
mc_CMP_ST0_ST1 |
jc .L82 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 235 |
call TConsole_Prout |
jmp .L90 |
.L82: |
mcLoadLocal edi, loc35.pTrekData |
inc [edi + TREKDATA.IDIDIT] |
fld [edi + TREKDATA.INSHLD] |
fld [edi + TREKDATA.SHLD] |
fld [esp + loc35.dbl_ETRANS] |
faddp |
mc_CMP_ST0_ST1 |
jc .L83 |
jz .L83 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 236 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 237 |
call TConsole_Prout |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.SHLD] |
fld [esi + TREKDATA.INSHLD] |
fsubp |
fld [esi + TREKDATA.ENERGY] |
faddp |
fstp [esi + TREKDATA.ENERGY] |
fld [esi + TREKDATA.INSHLD] |
fstp [esi + TREKDATA.SHLD] |
jmp .L90 |
.L83: |
fld [esp + loc35.dbl_ETRANS] |
fldz |
mc_CMP_ST0_ST1 |
jc .L8310 |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.INENRG] |
fld [esi + TREKDATA.ENERGY] |
fld [esp + loc35.dbl_ETRANS] |
fsubp |
mc_CMP_ST0_ST1 |
jc .L8310 |
jz .L8310 |
fld [esi + TREKDATA.INENRG] |
fld [esi + TREKDATA.ENERGY] |
fld [esi + TREKDATA.SHLD] |
faddp |
mc_CMP_ST0_ST1 |
jc .L8310 |
jz .L8310 |
call TConsole_SetCrewMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 148 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 238 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 239 |
call TConsole_Prout |
mcLoadLocal edi, loc35.pTrekData |
dec [edi + TREKDATA.IDIDIT] |
jmp .L90 |
.L8310: |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.SHLD] |
fld [esp + loc35.dbl_ETRANS] |
faddp |
fldz |
mc_CMP_ST0_ST1 |
jc .L84 |
jz .L84 |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 240 |
call TConsole_Prout |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.ENERGY] |
fld [esi + TREKDATA.SHLD] |
faddp |
fstp [esi + TREKDATA.ENERGY] |
fldz |
fstp [esi + TREKDATA.SHLD] |
jmp .L90 |
.L84: |
call TConsole_SetCrewMsgAttr |
mcLoad8bitsToReg32 ecx, 242 |
mcLoad8bitsToReg32 edx, 243 |
fld [esp + loc35.dbl_ETRANS] |
fldz |
mc_CMP_ST0_ST1 |
cmovnc ecx, edx |
call TConsole_Prout |
mcLoadLocal ebx, loc35.pTrekData |
fld [ebx + TREKDATA.SHLD] |
fld [esp + loc35.dbl_ETRANS] |
faddp |
fstp [ebx + TREKDATA.SHLD] |
fld [ebx + TREKDATA.ENERGY] |
fld [esp + loc35.dbl_ETRANS] |
fsubp |
fstp [ebx + TREKDATA.ENERGY] |
.L90: |
mcLoadLocal esi, loc35.pTrekData |
fld [esi + TREKDATA.SHLD] |
fldz |
mc_CMP_ST0_ST1 |
jc .done |
dec [esi + TREKDATA.SHLDUP] |
.done: |
mcEndLocals loc35.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TSrScan.Asm |
---|
0,0 → 1,519 |
; -------------------------------------------------------------------------- |
; FILE: TSrScan.Asm |
; DATE: October 11, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; AL = character from QUAD array |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_SetCosmosAttr: |
push ecx |
mcOnRegEqu al, CHAR_ASTERISK, .attr_star |
mcOnRegEqu al, CHAR_BLACK_HOLE, .attr_bhole |
mcOnRegEqu al, CHAR_COMMANDER, .attr_klingon |
mcOnRegEqu al, CHAR_ENTERPRISE, .attr_ship |
mcOnRegEqu al, CHAR_FQUEENE, .attr_ship |
mcOnRegEqu al, CHAR_KLINGON, .attr_klingon |
mcOnRegEqu al, CHAR_PLANET, .attr_planet |
mcOnRegEqu al, CHAR_ROMULAN, .attr_romulan |
mcOnRegEqu al, CHAR_SCOM, .attr_klingon |
mcOnRegEqu al, CHAR_STARBASE, .attr_base |
mcOnRegEqu al, CHAR_THING, .attr_thing |
mcOnRegEqu al, CHAR_THOLIAN, .attr_tholian |
mcOnRegEqu al, CHAR_WEB, .attr_web |
mov cl, ATTR_COSMOS |
jmp .apply |
.attr_star: |
mov cl, ATTR_STAR |
jmp .apply |
.attr_bhole: |
mov cl, ATTR_BLACK_HOLE |
jmp .apply |
.attr_klingon: |
mov cl, ATTR_KLINGON |
jmp .apply |
.attr_ship: |
mov cl, ATTR_SHIP |
jmp .apply |
.attr_planet: |
mov cl, ATTR_PLANET |
jmp .apply |
.attr_romulan: |
mov cl, ATTR_ROMULAN |
jmp .apply |
.attr_base: |
mov cl, ATTR_BASE |
jmp .apply |
.attr_thing: |
mov cl, ATTR_BLACK_HOLE |
jmp .apply |
.attr_tholian: |
mov cl, ATTR_THOLIAN |
jmp .apply |
.attr_web: |
mov cl, ATTR_WEB |
.apply: |
call TConsole_SetAttr |
pop ecx |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = row index from 1 to 10 |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_CramSpaceRow: |
dec eax |
imul eax, 10 |
mcLoadGameDataPtr edx |
lea esi, [edx + eax + TREKDATA.QUAD] |
mcLoad8bitsToReg32 ecx, 10 |
.dump_sector: |
push ecx |
lodsb |
call TSrScan_SetCosmosAttr |
call TConsole_PutChar |
mov al, CHAR_BLANK |
call TConsole_PutChar |
pop ecx |
loop .dump_sector |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ECX = index of SRSCAN report item text |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_Helper1: |
call TConsole_Cram |
mov cl, ATTR_REPORT_VALUE |
call TConsole_SetAttr |
mcLoadGameDataPtr ebx |
ret |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_PrintTubesInfo: |
mov ecx, 705 |
call TConsole_Cram |
mcLoadGameDataPtr esi |
movzx eax, [esi + TREKDATA.NPTUBES] |
call TConsole_CramInt |
mcLoadGameDataPtr esi |
cmp [esi + TREKDATA.QTORPS], 0 |
je .close_bracket |
cmp [esi + TREKDATA.TORPS], 0 |
je .close_bracket |
mov ecx, 706 |
call TConsole_Cram |
.close_bracket: |
mov al, ')' |
call TConsole_PutChar |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; EAX = row index from 1 to 10 |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_CramStatusRow: |
mov cl, ATTR_REPORT_TEXT |
call TConsole_SetAttr |
mcOnRegEqu eax, 1, .print_stardate |
mcOnRegEqu eax, 2, .print_condition |
mcOnRegEqu eax, 3, .print_position |
mcOnRegEqu eax, 4, .print_lsupport |
mcOnRegEqu eax, 5, .print_warp |
mcOnRegEqu eax, 6, .print_energy |
mcOnRegEqu eax, 7, .print_torpedoes |
mcOnRegEqu eax, 8, .print_shields |
mcOnRegEqu eax, 9, .print_klingons |
; |
; Time left |
; |
mcLoad8bitsToReg32 ecx, 103 |
call TSrScan_Helper1 |
fld [ebx + TREKDATA.REMTIME] |
mov cl, 2 |
call TConsole_CramFloat |
jmp .done |
.print_stardate: |
mcLoad8bitsToReg32 ecx, 94 |
call TSrScan_Helper1 |
fld [ebx + TREKDATA.DATE] |
mov cl, 1 |
call TConsole_CramFloat |
jmp .done |
.print_condition: |
mcLoad8bitsToReg32 ecx, 95 |
call TSrScan_Helper1 |
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
je .do_condition |
push ebx |
call TCommon_NewCondition |
pop ebx |
.do_condition: |
movzx eax, [ebx + TREKDATA.CONDIT] |
mov esi, glb_AttrCondition |
mov cl, [esi + eax - 1] |
call TConsole_SetAttr |
lea ecx, [eax + 103] |
call TConsole_Cram |
jmp .done |
.print_position: |
mcLoad8bitsToReg32 ecx, 96 |
call TSrScan_Helper1 |
mov al, [ebx + TREKDATA.QUADX] |
mov dl, [ebx + TREKDATA.QUADY] |
mcZeroBits ecx |
push ebx |
call TConsole_CramLoc |
mov al, ',' |
call TConsole_PutChar |
pop ebx |
mov al, [ebx + TREKDATA.SECTX] |
mov dl, [ebx + TREKDATA.SECTY] |
mcZeroBits ecx |
call TConsole_CramLoc |
jmp .done |
.print_lsupport: |
mcLoad8bitsToReg32 ecx, 97 |
call TSrScan_Helper1 |
mov cl, DEV_LIFE_SUPPORT |
call TArray_IsDamaged |
jc .L44 |
mcLoad8bitsToReg32 ecx, 108 |
call TConsole_Cram |
jmp .done |
.L44: |
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .L45 |
mcLoad8bitsToReg32 ecx, 109 |
call TConsole_Cram |
jmp .done |
.L45: |
mcLoad8bitsToReg32 ecx, 110 |
push ebx |
call TConsole_Cram |
pop ebx |
fld [ebx + TREKDATA.LSUPRES] |
mov cl, 2 |
mov dl, 4 |
call TConsole_CramFloatWidth |
jmp .done |
.print_warp: |
mcLoad8bitsToReg32 ecx, 98 |
call TSrScan_Helper1 |
fld [ebx + TREKDATA.WARPFAC] |
mov cl, 1 |
call TConsole_CramFloat |
jmp .done |
.print_energy: |
mcLoad8bitsToReg32 ecx, 99 |
call TSrScan_Helper1 |
fld [ebx + TREKDATA.ENERGY] |
mov cl, 2 |
call TConsole_CramFloat |
jmp .done |
.print_torpedoes: |
mcLoad8bitsToReg32 ecx, 100 |
call TSrScan_Helper1 |
movzx eax, [ebx + TREKDATA.TORPS] |
call TConsole_CramInt |
call TSrScan_PrintTubesInfo |
jmp .done |
.print_shields: |
mcLoad8bitsToReg32 ecx, 101 |
call TSrScan_Helper1 |
mov cl, DEV_SHIELDS |
call TArray_IsDamaged |
jc .shields_damaged |
movzx ecx, [ebx + TREKDATA.SHLDUP] |
add cl, 120 |
.cram_shields_state: |
push ebx |
call TConsole_Cram |
pop ebx |
fld [ebx + TREKDATA.SHLD] |
fld [ebx + TREKDATA.INSHLD] |
fdivp |
fld [glb_dbl_100] |
fmulp |
frndint |
call TCommon_FP_Truncate |
push ebx |
call TConsole_CramInt |
mcLoad8bitsToReg32 ecx, 111 |
call TConsole_Cram |
pop ebx |
fld [ebx + TREKDATA.SHLD] |
frndint |
call TCommon_FP_Truncate |
call TConsole_CramInt |
mcLoad8bitsToReg32 ecx, 112 |
call TConsole_Cram |
jmp .done |
.shields_damaged: |
mcLoad8bitsToReg32 ecx, 119 |
jmp .cram_shields_state |
.print_klingons: |
mcLoad8bitsToReg32 ecx, 102 |
call TSrScan_Helper1 |
movzx eax, [ebx + TREKDATA.REMKL] |
call TConsole_CramInt |
.done: |
ret |
; -------------------------------------------------------------------------- |
; STATUS |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_Status: |
call TConsole_ScrollUp |
mcLoad1 eax |
mcLoad8bitsToReg32 ecx, 10 |
.dump_row: |
push eax ecx |
call TSrScan_CramStatusRow |
call TConsole_ScrollUp |
pop ecx eax |
inc eax |
loop .dump_row |
call TConsole_ScrollUp |
ret |
; -------------------------------------------------------------------------- |
; REQUEST |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_Request: |
.L301: |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_ALPHA |
je .L303 |
.L302: |
mcLoad8bitsToReg32 ecx, 115 |
call TGame_Prompt |
jmp .L301 |
.L303: |
mcLoad8bitsToReg32 edx, 1 |
.check_cmd: |
mcLoad8bitsToReg32 ecx, 122 |
add ecx, edx |
push edx |
call TCmdBuf_Crop |
pop edx |
jc .row_in_EDX |
inc edx |
cmp edx, 10 |
jbe .check_cmd |
; |
; List possible request items |
; |
call TConsole_ScrollUp |
call TConsole_SetGameMsgAttr |
mcLoad8bitsToReg32 ecx, 116 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 117 |
call TConsole_Prout |
mcLoad8bitsToReg32 ecx, 118 |
call TConsole_Prout |
call TConsole_ScrollUp |
jmp .L302 |
.row_in_EDX: |
push edx |
call TConsole_ScrollUp |
pop eax |
; |
; Due to mapping we need to swap places of |
; TIME and TORPEDOES request. Basic logic here as follows: |
; |
; IF (EAX == 7) THEN EAX=10 |
; IF (EAX == 10) THEN EAX=7 |
; |
mcOnRegEqu eax, 7, .load_10 |
mcOnRegEqu eax, 10, .load_7 |
.dump_info: |
call TSrScan_CramStatusRow |
call TConsole_ScrollUp |
call TConsole_ScrollUp |
ret |
.load_7: |
sub eax, 3 |
jmp .dump_info |
.load_10: |
add eax, 3 |
jmp .dump_info |
; -------------------------------------------------------------------------- |
; SRSCAN |
; -------------------------------------------------------------------------- |
virtual at 0 |
loc24: |
.bRightSide BOOL ? |
.nRow INDEX ? |
.size = $ |
end virtual |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TSrScan_Main: |
mcBeginLocals loc24.size |
mov cl, DEV_SR_SENSORS |
call TArray_IsDamaged |
jnc .proceed |
mcLoadGameDataPtr ebx |
cmp [ebx + TREKDATA.CONDIT], CONDITION_DOCKED |
jne .not_available |
.proceed: |
mcLoad1 eax |
mcStoreLocal loc24.bRightSide, eax |
mcStoreLocal loc24.nRow, eax |
call TCmdBuf_Scan |
cmp [ebx + TCmdBuf.cmdbuf_KEY], CMD_TOKEN_EOL |
je .L3 |
mcLoad8bitsToReg32 ecx, 122 |
call TCmdBuf_Crop |
jnc .L3 |
dec [esp + loc24.bRightSide] |
.L3: |
mcLoadLocal ecx, loc24.nRow |
mcLoadGameDataPtr ebx |
mcLoadMember al, TREKDATA.QUADX |
mcLoadMember dl, TREKDATA.QUADY |
call TArray_SetStarChartValue |
call TArray_SetScanned |
call TConsole_ScrollUp |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 113 |
call TConsole_Prout |
.dump_row: |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
mcLoadLocal eax, loc24.nRow |
mov cl, 3 |
call TConsole_CramIntWidth |
mov al, CHAR_BLANK |
call TConsole_PutChar |
mcLoadLocal eax, loc24.nRow |
call TSrScan_CramSpaceRow |
cmp [esp + loc24.bRightSide], 0 |
je .next_row |
mcLoadLocal eax, loc24.nRow |
call TSrScan_CramStatusRow |
.next_row: |
call TConsole_ScrollUp |
inc [esp + loc24.nRow] |
cmp [esp + loc24.nRow], 10 |
jbe .dump_row |
mov cl, ATTR_SCAN_SCALE |
call TConsole_SetAttr |
mcLoad8bitsToReg32 ecx, 113 |
call TConsole_Prout |
jmp .done |
.not_available: |
call TConsole_SetGameMsgAttr |
call TConsole_ScrollUp |
mcLoad8bitsToReg32 ecx, 114 |
call TConsole_Prout |
.done: |
call TConsole_ScrollUp |
mcEndLocals loc24.size |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/TString.Asm |
---|
0,0 → 1,78 |
; -------------------------------------------------------------------------- |
; FILE: TString.Asm |
; DATE: September 21, 2008 |
; -------------------------------------------------------------------------- |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = source string |
; EDI = destination string |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TString_Copy: |
mcZeroBits eax |
.more: |
lodsw |
stosw |
mcOnRegNotZero eax, .more |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = source string |
; EDI = destination string |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TString_AnsiCopy: |
mcZeroBits eax |
.more: |
lodsb |
stosb |
mcOnRegNotZero eax, .more |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = string #1 |
; EDI = string #2 |
; Output: |
; CF=1 if strings are same |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TString_AnsiEqual: |
push esi edi |
.check_both: |
cmpsb |
jne .ret_false |
cmp byte [esi - 1], 0 |
jne .check_both |
pop edi esi |
stc |
ret |
.ret_false: |
pop edi esi |
clc |
ret |
; -------------------------------------------------------------------------- |
; Input: |
; ESI = source string |
; EDI = destination string |
; Output: |
; EDI = set to concatenate another string |
; -------------------------------------------------------------------------- |
align PROC_ALIGN |
TString_CopyEx: |
call TString_Copy |
sub edi, 2 |
ret |
; --- EOF --- |
/programs/games/StarTrek/trunk/Win32.Inc |
---|
0,0 → 1,255 |
; ----------------------------------------------------------- |
; Win32 API definitions |
; ----------------------------------------------------------- |
; ----------------------------------------------------------- |
; Type Alias Section |
; ----------------------------------------------------------- |
INT32 equ dd |
PINT32 equ dd |
INT16 equ dw |
SHORT equ dw |
WNDPROC equ dd |
COUNT equ dd |
UINT32 equ dd |
UINT8 equ db |
WORD equ dw |
BYTE equ db |
CHAR equ db |
PBYTE equ dd |
NBYTES equ dd |
HICON equ dd |
HBRUSH equ dd |
HBITMAP equ dd |
HCURSOR equ dd |
HINSTANCE equ dd |
PWCHAR equ dd |
PCHAR equ dd |
PPCHAR equ dd |
PDOUBLE equ dd |
PPWCHAR equ dd |
WCHARS equ rw |
CHARS equ rb |
HWND equ dd |
DOUBLE equ dt |
DOUBLES equ rt |
HANDLE equ dd |
HFILE equ dd |
HDC equ dd |
HFONT equ dd |
BOOL equ dd |
PBOOL equ dd |
LONG equ dd |
WPARAM equ dd |
LPARAM equ dd |
INDEX equ dd |
COLORREF equ dd |
PSIZE equ dd |
PVOID equ dd |
PCOORD equ dd |
FUNCTOR equ dd |
PDEVICE equ dd |
STRINGS equ rd |
INTEGERS equ rd |
POINTERS equ rd |
COLORREFS equ rd |
CHARS equ rb |
BYTES equ rb |
; ----------------------------------------------------------- |
; Pointers to classes |
; ----------------------------------------------------------- |
PTLine equ dd |
PTOutputCell equ dd |
PTCmdBuf equ dd |
PTRandom equ dd |
PTPalette equ dd |
PTGameState equ dd |
PTPlanet equ dd |
PTKlingon equ dd |
PTCharAttr equ dd |
PTLineBuf equ dd |
PTConsole equ dd |
PTCharacter equ dd |
; ----------------------------------------------------------- |
; Constants |
; ----------------------------------------------------------- |
HEAP_NO_SERIALIZE = 1 |
DEFAULT_CHARSET = 1 |
LF_FACESIZE = 32 |
IDC_ARROW = 32512 |
IDI_EXCLAMATION = 32515 |
SM_CXSCREEN = 0 |
SM_CYSCREEN = 1 |
WS_EX_APPWINDOW = 40000h |
WS_THICKFRAME = 40000h |
WS_SYSMENU = 80000h |
WS_MINIMIZEBOX = 20000h |
WS_CAPTION = 0C00000h |
WS_OVERLAPPEDWND = WS_CAPTION or WS_SYSMENU or WS_THICKFRAME or WS_MINIMIZEBOX |
WS_NOSIZEWND = WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX |
WM_CREATE = 1 |
WM_DESTROY = 2 |
WM_PAINT = 0Fh |
WM_CLOSE = 10h |
WM_ERASEBKGND = 14h |
WM_CHAR = 102h |
WM_APP = 8000h |
MEM_COMMIT = 1000h |
MEM_RESERVE = 2000h |
MEM_RELEASE = 8000h |
PAGE_READWRITE = 4 |
SW_SHOWNORMAL = 1 |
SM_CYCAPTION = 4 |
SM_CXBORDER = 5 |
SM_CYBORDER = 6 |
LOGPIXELSY = 90 |
FW_NORMAL = 400 |
CHAR_BACKSPACE = 8 |
CHAR_ENTER = 0Dh |
CHAR_ESC = 1Bh |
CHAR_BLANK = 20h |
CHAR_COSMOS = 0B7h |
;CHAR_COSMOS = '.' |
CHAR_ASTERISK = '*' |
CHAR_ENTERPRISE = 'E' |
CHAR_FQUEENE = 'F' |
CHAR_ZERO = '0' |
CHAR_PLANET = 'P' |
CHAR_KLINGON = 'K' |
CHAR_ROMULAN = 'R' |
CHAR_SCOM = 'S' |
CHAR_THOLIAN = 'T' |
CHAR_WEB = '#' |
CHAR_THING = '?' |
CHAR_STARBASE = 'B' |
CHAR_BLACK_HOLE = '@' |
CHAR_COMMA = ',' |
CHAR_COMMANDER = 'C' |
SRCCOPY = 0CC0020h |
FIXED_PITCH = 1 |
TRANSPARENT = 1 |
TA_UPDATECP = 1 |
WHITE_BRUSH = 0 |
BLACK_BRUSH = 4 |
WM_CUSTOM_CMD_READY = (WM_APP + 1) |
WM_CUSTOM_DO_PRELIM = (WM_APP + 2) |
WM_CUSTOM_NEW_GAME = (WM_APP + 3) |
GENERIC_READ = 80000000h |
GENERIC_WRITE = 40000000h |
CREATE_ALWAYS = 2 |
OPEN_EXISTING = 3 |
FILE_FLAG_SEQ_SCAN = 08000000h |
FILE_ATTR_DIR = 10h |
; ----------------------------------------------------------- |
; Structure Definitions |
; ----------------------------------------------------------- |
virtual at 0 |
SIZE: |
.size_Width INT32 ? |
.size_Height INT32 ? |
.size = $ |
end virtual |
virtual at 0 |
RECT: |
.rc_Left INT32 ? |
.rc_Top INT32 ? |
.rc_Right INT32 ? |
.rc_Bottom INT32 ? |
.size = $ |
end virtual |
virtual at 0 |
MSG: |
.msg_hWnd HWND ? |
.msg_uiMsg UINT32 ? |
.msg_wParam WPARAM ? |
.msg_lParam LPARAM ? |
.msg_uiTime UINT32 ? |
.msg_xCoord INT32 ? |
.msg_yCoord INT32 ? |
.size = $ |
end virtual |
virtual at 0 |
LOGFONT: |
.lf_Height LONG ? |
.lf_Width LONG ? |
.lf_Escapement LONG ? |
.lf_Orientation LONG ? |
.lf_Weight LONG ? |
.lf_Italic UINT8 ? |
.lf_Underline UINT8 ? |
.lf_StrikeOut UINT8 ? |
.lf_CharSet UINT8 ? |
.lf_OutPrecision UINT8 ? |
.lf_ClipPrecision UINT8 ? |
.lf_Quality UINT8 ? |
.lf_PitchAndFamily UINT8 ? |
.lf_FaceName WCHARS LF_FACESIZE |
.size = $ |
end virtual |
virtual at 0 |
WIN32_FIND_DATA: |
.dwAttr UINT32 ? |
._pad1 rd 10 |
.strName WCHARS 260 |
.strName2 WCHARS 14 |
.size = $ |
end virtual |
virtual at 0 |
SYSTIME: |
.wYear WORD ? |
.wMonth WORD ? |
.wDayOfWeek WORD ? |
.wDay WORD ? |
.wHour WORD ? |
.wMinute WORD ? |
.wSecond WORD ? |
.wMillisecond WORD ? |
.size = $ |
end virtual |
virtual at 0 |
PAINTSTRUCT: |
.hDC HDC ? |
.bErase BOOL ? |
.rcPaint rb RECT.size |
.bRestore BOOL ? |
.bIncUpdate BOOL ? |
.rgbReserved rb 32 |
.size = $ |
end virtual |
virtual at 0 |
LOCATION: |
.coord_X BYTE ? |
.coord_Y BYTE ? |
.size = $ |
end virtual |
virtual at 0 |
WNDCLASS: |
.wc_style UINT32 ? |
.wc_lpfnWndProc WNDPROC ? |
.wc_cbClsExtra NBYTES ? |
.wc_cbWndExtra NBYTES ? |
.wc_hInstance HINSTANCE ? |
.wc_hIcon HICON ? |
.wc_hCursor HCURSOR ? |
.wc_hbrBackground HBRUSH ? |
.wc_lpszMenuName PWCHAR ? |
.wc_lpszClassName PWCHAR ? |
.size = $ |
end virtual |
;<EOF> |
/programs/games/StarTrek/trunk |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |
/programs/games/StarTrek |
---|
Property changes: |
Added: tsvn:logminsize |
+5 |
\ No newline at end of property |