//************************************************************************ // You are free to copy this source and use it in any way you deem fit //************************************************************************* // Program: Class file for Damsels in distress game // Provides recording of moves and demo replay facility // Also stores levels description strings // Note: can not have too many classes for internet programs. // Loading becomes too slow. // Programmer: H K Gupta // Version: 1.0 dated 07/30/97 //************************************************************************* import java.awt.*; import java.lang.Math; import java.lang.Integer; public class SaveTheCatsRecorder { SaveTheCatsRecorder() { recordCount = new short[maxRecordBuffer]; recordMoves = new short[maxRecordBuffer]; demoRecordedCount = new short[maxRecordBuffer]; demoRecordedMoves = new short[maxRecordBuffer]; loadDemo(); } // For self running demo OR replay private int demoKeys = 0; // Total Keys private int demoIndex; private short[] demoCount; private short[] demoMoves; // For recording of game private int recordedKeys = 0; private int recordedLevel = 1; private short[] recordCount; // for recording the game private short[] recordMoves; private int maxRecordBuffer = 250; // Level 1 Demo stored as a prerecorded game private int demoRecordedLength; // Level 1 Demo prerecorded private short[] demoRecordedCount; private short[] demoRecordedMoves; private String sDemo = "39,54,18,39,34,17,20,43,26,36,0,27,9,36,33,1,44,19" + ",0,9,18,3,42,11,0,22,9,26,17,10,10,3,41,5,0,105,9," + "48,25,27,18,34,34,1,52,12,0,5,18,3,50,8,0,17,18,22" + ",9,3,49,8,0,106,18,47,26,60,0,109,9,38,33,25,12,40" + ",25,5,19,8,26,0,0," ; private void loadDemo() { // copy demo string into demo buffer sRec = sDemo; demoRecordedLength = breakStringInNumbers(demoRecordedCount, demoRecordedMoves); } private String sRec; private int nIndex; boolean acceptRecordedString(TextArea t, int level) { getStringFromTextArea(t, false); recordedKeys = breakStringInNumbers(recordCount, recordMoves); recordedLevel = level; return true; } private int breakStringInNumbers(short[] count, short[] moves) { nIndex = 0; int keys = (short)getInteger(); if(keys >= maxRecordBuffer) keys = maxRecordBuffer; for(int i = 0; i <= keys; i++) { count[i] = (short)getInteger(); moves[i] = (short)getInteger(); } return keys; } private int getInteger() { // return Integer and also skip comma int ret = 0; int minus = 1; if(nIndex > sRec.length()) return 0; if(sRec.charAt(nIndex) == '-') { minus = -1; nIndex++; } while((sRec.charAt(nIndex) >= '0') && (sRec.charAt(nIndex) <= '9')) { if(nIndex > sRec.length()) return 0; ret = ret * 10 + (int)sRec.charAt(nIndex) - (int)'0'; nIndex++; } if(nIndex > sRec.length()) return 0; if(sRec.charAt(nIndex) == ',') nIndex++; return ret * minus; } private int demoCounter; private boolean recorederOn = false; public void initRecorder(int level) { recordedKeys = 0; recordedLevel = level; } public int getRecordedLevel() { return recordedLevel; } public void recordMove(int move) { short tmp; if(demoIndex < (maxRecordBuffer - 1)) { tmp = (short)move; if(demoIndex >= 0) { if(recordMoves[demoIndex] == tmp) { recordCount[demoIndex]++; } else { demoIndex++; recordMoves[demoIndex] = tmp; recordCount[demoIndex] = 1; } } else { demoIndex++; recordMoves[demoIndex] = tmp; recordCount[demoIndex] = 1; } recordedKeys = demoIndex + 1; } } public void initRecording() { demoIndex = -1; } public void startReplay() { demoKeys = recordedKeys; demoCount = recordCount; demoMoves = recordMoves; demoIndex = -1; } public void startDemo() { demoKeys = demoRecordedLength; demoCount = demoRecordedCount; demoMoves = demoRecordedMoves; demoIndex = -1; } public int returnMove() { // -1 if no more moves else mOne * 8 + mTwo if(demoIndex < 0) { demoIndex = 0; demoCounter = 0; } if(demoCounter >= demoCount[demoIndex]) { demoIndex++; demoCounter = 0; if(demoIndex >= demoKeys) return -1; } demoCounter++; return (int)demoMoves[demoIndex]; } boolean showRecordedString(TextArea t) { StringBuffer s = new StringBuffer(1000); s.append("" + recordedKeys + ","); for(int i = 0; i <= recordedKeys; i++) { s.append("" + recordCount[i] + "," + recordMoves[i] + ","); } showStringInTextArea(t, s.toString()); return true; } private void showStringInTextArea(TextArea t, String s) { t.setText(""); int len = s.length(); for(int i = 0; i < len; i += 50) { t.appendText("\""); t.appendText(s.substring(i, Math.min(i + 50, len))); t.appendText("\"\n"); } } // Sneak in the Level data to save on one extra class public int getMaxLevels() { return maxLevels; } void setMyLevel(StringBuffer s) { sLevels[maxLevels] = s.toString(); } void showMyLevel(TextArea t) { showStringInTextArea(t, sLevels[maxLevels]); } void acceptMyLevel(TextArea t) { getStringFromTextArea(t, true); } private void getStringFromTextArea(TextArea t, boolean flagMyLevel) { String inputS = t.getText(); StringBuffer s = new StringBuffer(1000); for(int i = 0; i < inputS.length(); i++) { if(inputS.charAt(i) > '"') s.append(inputS.charAt(i)); } if(flagMyLevel) { sLevels[maxLevels] = s.toString(); } else { sRec = s.toString(); } } String[] sLevels = { // Level 1 "LKKKKKKLKXsssssssrV########&##XrV$KKKKK>" + "+++,+-+-)-*<)<*GGGGGGGGGGGGGGGGGGGGGG", // Level 4 "+sssssssksssskssssq#+sY=k#+q#+sY=k#+q#+sY=k#+q#+k#" + "#k#+sssk##sssssk###+ssssk###+sssY#####%ss#######sq" + "#######=k#######+Y#######%6#,/=/9-0-4+,-0+4)9+=-GG" + "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", // Level 5 "sssssssssfKKKKKKKLjsssssssph#######:hKKKKKKK:hG&#," + "#>':hG&#,#>':hHKK-KKB:hHKG#'KB:hHKHKBKB:h#######:j" + "ssssssspfKKKKKKKLsssssssss5#4-+)0)8)>)*&7&0&>&30)*" + ")+),@*@+@,5*5+3*3+4+6+2+1,1+7+8+8,GGGGGGGGGGGGGG", // Level 6 "Y#######%Y##=Ys##%sssk#%sssY##%KP##%Y##%HP##%Y##%H" + "P##%[KY%HP%K[[?Y%HP%?[[?Y%HP%?[[?Y%HP%?[[?Y%HP%?[[" + "?Y%HP%?[[#Y%#5%#[KKKKKKKKK3#(+)+5(A+@+&(+(>(C(5%'/" + "*/3/4/6/7/?/B/GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG", // My level (For editor purpose only) "#######################################################################" + "#######################################################GGGGGGGGGGGGGGGG" + "GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG" }; private int maxLevels = sLevels.length - 1; }