Overview
Comment: | Implement the Sound instruction. (There are still a few problems such as clicks at the end of some sound effects, and a few problems with the sound test menu. However, it mostly works, now.) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
d15195a921f6ff832bdb135bfb43a272 |
User & Date: | user on 2022-01-29 05:55:37 |
Other Links: | manifest | tags |
Context
2022-02-04
| ||
06:56 | Correct parsing instruction names beginning with a plus and minus sign. check-in: 547bf4ed86 user: user tags: trunk | |
2022-01-29
| ||
05:55 | Implement the Sound instruction. (There are still a few problems such as clicks at the end of some sound effects, and a few problems with the sound test menu. However, it mostly works, now.) check-in: d15195a921 user: user tags: trunk | |
2022-01-25
| ||
06:31 | Implement (attribute userflags) syntax, in order to access bit patterns of user flags directly in class codes (e.g. so that they can be passed to subroutines, etc). check-in: a724f44255 user: user tags: trunk | |
Changes
Modified TODO from [c921c09e17] to [a63cc0af2f].
1 | * Sound effects | < < < | < | 1 2 3 4 5 6 7 8 9 | * Sound effects * Compressed wave sounds (?) * Numeric sounds (?) * Game engine features * Multiple connected objects moving as a unit * String data (partially implemented) * A ,PopUp command to use a popup with arguments starting from a mark * "Goto message" instruction (?) * Returning a class from COLLIDE/COLLIDEBY to transform |
︙ | ︙ |
Modified bindings.doc from [09ad0658cd] to [ba75b7ef57].
︙ | ︙ | |||
229 230 231 232 233 234 235 236 237 238 239 240 241 242 | '^P' Switch to the game play. '^Q' Quit. 'go' <level> Go to the specified level. If the level number is negative, then it is a level order number, otherwise it is a level ID number. === Mode-independent commands === | > > > | 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | '^P' Switch to the game play. '^Q' Quit. '^Y' Sound test. (Does nothing if sound is not configured.) 'go' <level> Go to the specified level. If the level number is negative, then it is a level order number, otherwise it is a level ID number. === Mode-independent commands === |
︙ | ︙ |
Modified class.c from [633629bcf7] to [5513be6ecd].
︙ | ︙ | |||
524 525 526 527 528 529 530 | break; case '$': if(fl) ParseError("Invalid use of , and = in token\n"); tokent=TF_NAME; tokenv=look_class_name()+0x4000; break; case '!': | < | | 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 | break; case '$': if(fl) ParseError("Invalid use of , and = in token\n"); tokent=TF_NAME; tokenv=look_class_name()+0x4000; break; case '!': if(fl) ParseError("Invalid use of , and = in token\n"); tokent=TF_NAME; tokenv=find_user_sound(tokenstr); break; case '%': if(fl&TF_COMMA) ParseError("Invalid use of , in token\n"); tokent=TF_NAME|TF_ABNORMAL|fl; tokenv=OP_LOCAL; break; case '@': |
︙ | ︙ | |||
1073 1074 1075 1076 1077 1078 1079 | if(tokent==TF_INT) { return NVALUE(tokenv); } else if(Tokenf(TF_NAME)) { switch(tokenv) { case 0x0000 ... 0x00FF: return NVALUE(tokenv); case 0x0100 ... 0x01FF: return NVALUE(tokenv-0x0200); case 0x0200 ... 0x02FF: return MVALUE(tokenv&255); | | | | 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 | if(tokent==TF_INT) { return NVALUE(tokenv); } else if(Tokenf(TF_NAME)) { switch(tokenv) { case 0x0000 ... 0x00FF: return NVALUE(tokenv); case 0x0100 ... 0x01FF: return NVALUE(tokenv-0x0200); case 0x0200 ... 0x02FF: return MVALUE(tokenv&255); case 0x0300 ... 0x03FF: return UVALUE(tokenv&255,TY_SOUND); case 0x0400 ... 0x04FF: return UVALUE(tokenv&255,TY_USOUND); case 0x4000 ... 0x7FFF: return CVALUE(tokenv-0x4000); case OP_STRING: return UVALUE(pool_string(tokenstr),TY_STRING); case OP_BITCONSTANT ... OP_BITCONSTANT_LAST: return NVALUE(1<<(tokenv&31)); case 0xC000 ... 0xFFFF: return MVALUE(tokenv-0xBF00); } } ParseError("Constant value expected\n"); |
︙ | ︙ |
Modified default.heromeshrc from [7f0656bbc7] to [eab9494892].
︙ | ︙ | |||
182 183 184 185 186 187 188 189 190 191 | ?.?.kp_plus: select 'go',-(level()+1) where level()<max_level(); ?.?.shift.kp_minus: select 'go',-1; ?.?.shift.kp_plus: select 'go',-max_level(); ?.?.ctrl.G: select 'go',-:Go_To_Level where :Go_To_Level=cast(:Go_To_Level as int) and cast(:Go_To_Level as int)>0; ?.?.ctrl.Q: ^Q ?.?.ctrl.S: ^S ?.?.ctrl.T: ^T ?.?.shift.ctrl.M: select ':s'; ?.?.f10: select ':x'; | > | 182 183 184 185 186 187 188 189 190 191 192 | ?.?.kp_plus: select 'go',-(level()+1) where level()<max_level(); ?.?.shift.kp_minus: select 'go',-1; ?.?.shift.kp_plus: select 'go',-max_level(); ?.?.ctrl.G: select 'go',-:Go_To_Level where :Go_To_Level=cast(:Go_To_Level as int) and cast(:Go_To_Level as int)>0; ?.?.ctrl.Q: ^Q ?.?.ctrl.S: ^S ?.?.ctrl.T: ^T ?.?.ctrl.Y: ^Y ?.?.shift.ctrl.M: select ':s'; ?.?.f10: select ':x'; |
Modified edit.c from [13e928d083] to [cc13f87281].
︙ | ︙ | |||
1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 | return -1; case '^S': // Save level save_level(); return 1; case '^T': // Level title edit_string(&level_title); return 0; case '^Z': // Cancel rectangle editrect.x0=editrect.y0=editrect.x1=editrect.y1=0; return prev; case '^<': // First corner if((number&63?:64)>pfwidth || (number/64?:64)>pfheight) return prev; editrect.x0=number&63?:64; editrect.y0=number/64?:64; | > > > | 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 | return -1; case '^S': // Save level save_level(); return 1; case '^T': // Level title edit_string(&level_title); return 0; case '^Y': // Sound test sound_test(); return prev; case '^Z': // Cancel rectangle editrect.x0=editrect.y0=editrect.x1=editrect.y1=0; return prev; case '^<': // First corner if((number&63?:64)>pfwidth || (number/64?:64)>pfheight) return prev; editrect.x0=number&63?:64; editrect.y0=number/64?:64; |
︙ | ︙ |
Modified edit.doc from [a922353611] to [5f662b4d3a].
︙ | ︙ | |||
223 224 225 226 227 228 229 230 231 232 233 234 235 236 | CTRL+I Level index editor CTRL+N Add new level (after last one) CTRL+P Switch to play game (won't auto save) CTRL+Q Quit (won't auto save) CTRL+S Save level CTRL+T Edit level title CTRL+X Clear level (delete all objects) C Set level code number E Edit level strings F Fill grid with current MRU R Clear and resize level W Exchange main/bizarro worlds F1 Import level (replacing current level) F2 Export level | > | 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | CTRL+I Level index editor CTRL+N Add new level (after last one) CTRL+P Switch to play game (won't auto save) CTRL+Q Quit (won't auto save) CTRL+S Save level CTRL+T Edit level title CTRL+X Clear level (delete all objects) CTRL+Y Sound test C Set level code number E Edit level strings F Fill grid with current MRU R Clear and resize level W Exchange main/bizarro worlds F1 Import level (replacing current level) F2 Export level |
︙ | ︙ |
Modified exec.c from [d3751950c5] to [a961423181].
︙ | ︙ | |||
2733 2734 2735 2736 2737 2738 2739 | case OP_STRENGTH: StackReq(0,1); Push(NVALUE(o->strength)); break; case OP_STRENGTH_C: StackReq(1,1); Push(GetVariableOrAttributeOf(strength,NVALUE)); break; case OP_STRENGTH_E: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->strength=t1.u; break; case OP_STRENGTH_E16: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->strength=t1.u&0xFFFF; break; case OP_STRENGTH_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->strength=t1.u; break; case OP_STRENGTH_EC16: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->strength=t1.u&0xFFFF; break; case OP_STRING: StackReq(0,1); Push(UVALUE(code[ptr++],TY_STRING)); break; | | | 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 | case OP_STRENGTH: StackReq(0,1); Push(NVALUE(o->strength)); break; case OP_STRENGTH_C: StackReq(1,1); Push(GetVariableOrAttributeOf(strength,NVALUE)); break; case OP_STRENGTH_E: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->strength=t1.u; break; case OP_STRENGTH_E16: NoIgnore(); StackReq(1,0); t1=Pop(); Numeric(t1); o->strength=t1.u&0xFFFF; break; case OP_STRENGTH_EC: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->strength=t1.u; break; case OP_STRENGTH_EC16: NoIgnore(); StackReq(2,0); t1=Pop(); Numeric(t1); i=v_object(Pop()); if(i!=VOIDLINK) objects[i]->strength=t1.u&0xFFFF; break; case OP_STRING: StackReq(0,1); Push(UVALUE(code[ptr++],TY_STRING)); break; case OP_SOUND: StackReq(2,0); t2=Pop(); t1=Pop(); set_sound_effect(t1,t2); break; case OP_SUB: StackReq(2,1); t2=Pop(); Numeric(t2); t1=Pop(); Numeric(t1); Push(NVALUE(t1.u-t2.u)); break; case OP_SUPER: i=code[1]; code=classes[i]->codes; ptr=get_message_ptr(i,msgvars.msg); if(ptr==0xFFFF) break; break; case OP_SUPER_C: i=code[1]; j=get_message_ptr(i,msgvars.msg); if(j!=0xFFFF) execute_program(classes[i]->codes,j,obj); break; case OP_SWAP: StackReq(2,2); t1=Pop(); t2=Pop(); Push(t1); Push(t2); break; case OP_SWAPWORLD: NoIgnore(); swap_world(); break; case OP_SWEEP: StackReq(8,0); v_sweep(obj,NVALUE(0)); break; case OP_SWEEPEX: StackReq(9,0); t1=Pop(); v_sweep(obj,t1); break; |
︙ | ︙ |
Modified game.c from [e517a0c994] to [73bec037e1].
︙ | ︙ | |||
1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 | case '^Q': // Quit return -1; case '^S': // Save solution if(gameover==1) record_solution(); return 1; case '^T': // Show title modal_draw_popup(level_title); return prev; case '^d': // Describe object describe_at(number-65); return prev; case '^g': // Display global variables global_examine(); return prev; | > > > | 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 | case '^Q': // Quit return -1; case '^S': // Save solution if(gameover==1) record_solution(); return 1; case '^T': // Show title modal_draw_popup(level_title); return prev; case '^Y': // Sound test sound_test(); return prev; case '^d': // Describe object describe_at(number-65); return prev; case '^g': // Display global variables global_examine(); return prev; |
︙ | ︙ |
Modified game.doc from [7328cb695b] to [fefbd2794f].
︙ | ︙ | |||
139 140 141 142 143 144 145 146 147 148 149 150 151 152 | CTRL+G Go to level CTRL+I Import move list CTRL+L List of levels CTRL+Q Quit CTRL+S Save solution CTRL+T Display level title CTRL+X Export move list F1 Replay 1 move F2 Replay 10 moves F3 Replay 100 moves F4 Replay 1000 moves SHIFT+F1 Rewind 1 move SHIFT+F2 Rewind 10 moves SHIFT+F3 Rewind 100 moves | > | 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | CTRL+G Go to level CTRL+I Import move list CTRL+L List of levels CTRL+Q Quit CTRL+S Save solution CTRL+T Display level title CTRL+X Export move list CTRL+Y Sound test F1 Replay 1 move F2 Replay 10 moves F3 Replay 100 moves F4 Replay 1000 moves SHIFT+F1 Rewind 1 move SHIFT+F2 Rewind 10 moves SHIFT+F3 Rewind 100 moves |
︙ | ︙ |
Modified sound.c from [8e65d6bcfc] to [cf457c80d7].
︙ | ︙ | |||
193 194 195 196 197 198 199 | i--; j=fgetc(fp)<<16; j|=fgetc(fp)<<24; j|=fgetc(fp)<<0; j|=fgetc(fp)<<8; l_offset=ftell(fp); l_size=j; if(i>4 && nam[i-4]=='.' && nam[i-3]=='W' && nam[i-1]=='V' && (nam[i-2]=='A' || nam[i-2]=='Z')) { j=nam[i-2]; nam[i-4]=0; if(is_user) { | | | 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | i--; j=fgetc(fp)<<16; j|=fgetc(fp)<<24; j|=fgetc(fp)<<0; j|=fgetc(fp)<<8; l_offset=ftell(fp); l_size=j; if(i>4 && nam[i-4]=='.' && nam[i-3]=='W' && nam[i-1]=='V' && (nam[i-2]=='A' || nam[i-2]=='Z')) { j=nam[i-2]; nam[i-4]=0; if(is_user) { if(nusersounds>255) goto done; i=nusersounds++; usersounds=realloc(usersounds,nusersounds*sizeof(WaveSound)); user_sound_names=realloc(user_sound_names,nusersounds*sizeof(Uint8*)); if(!usersounds || !user_sound_names) fatal("Allocation failed\n"); user_sound_names[i]=strdup(nam); if(!user_sound_names[i]) fatal("Allocation failed\n"); ws=usersounds+i; |
︙ | ︙ | |||
406 407 408 409 410 411 412 | Value v; char buf[256]; if(main_options['T'] && main_options['v']) { if(mmltuning) printf("mmltempo=%d; mmlvolume=%d; mmltuning[96]=%d\n",(int)mmltempo,(int)mmlvolume,(int)mmltuning[96]); for(i=0;i<nusersounds;i++) printf("%d: %s (ptr=%p, len=%d bytes)\n",i,user_sound_names[i],usersounds[i].data,usersounds[i].len); fflush(stdout); } | | | 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 | Value v; char buf[256]; if(main_options['T'] && main_options['v']) { if(mmltuning) printf("mmltempo=%d; mmlvolume=%d; mmltuning[96]=%d\n",(int)mmltempo,(int)mmlvolume,(int)mmltuning[96]); for(i=0;i<nusersounds;i++) printf("%d: %s (ptr=%p, len=%d bytes)\n",i,user_sound_names[i],usersounds[i].data,usersounds[i].len); fflush(stdout); } if(!screen || !sound_on) return; nitems=nstandardsounds+nusersounds+8; columns=(screen->w-16)/240?:1; scrmax=(nitems+columns-1)/columns; set_cursor(XC_arrow); redraw: SDL_FillRect(screen,0,0x02); r.x=r.y=0; |
︙ | ︙ |