Changeset 3d333fd in Readingame
- Timestamp:
- Aug 19, 2023, 3:57:25 PM (10 months ago)
- Branches:
- main
- Children:
- a607072
- Parents:
- 3d27dc6
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
HyperTextView.cpp
r3d27dc6 r3d333fd 201 201 202 202 203 bool 204 HyperTextView::HasHeightForWidth() 205 { 206 return BView::HasHeightForWidth(); 207 } 208 209 210 void 211 HyperTextView::GetHeightForWidth(float width, float* min, float* max, float* preferred) 212 { 213 BView::GetHeightForWidth(width, min, max, preferred); 214 } 215 216 203 217 void 204 218 HyperTextView::SetText(const char* text) -
HyperTextView.h
r3d27dc6 r3d333fd 29 29 virtual void Clicked(HyperTextView* view, BPoint where, 30 30 BMessage* message); 31 32 31 private: 33 32 int32 fMessage; … … 50 49 virtual void MouseMoved(BPoint where, uint32 transit, 51 50 const BMessage* dragMessage); 51 52 virtual bool HasHeightForWidth() override; 53 virtual void GetHeightForWidth(float width, float* min, 54 float* max, float* preferred) override; 52 55 53 56 void SetText(const char* text); -
main.cpp
r3d27dc6 r3d333fd 17 17 #include <String.h> 18 18 #include <TextEncoding.h> 19 #include <TextView.h>20 19 #include <Window.h> 21 20 … … 27 26 28 27 #define BOLD "\x1B[34m" 28 #define COLOR "\x1B[33m" 29 29 #define NORMAL "\x1B[0m" 30 30 … … 177 177 std::vector<uint8_t> gVar8; 178 178 std::vector<uint16_t> gVar16; 179 std::vector<bool> gVar1; 179 180 180 181 uint8_t gCurrentRoom; 181 182 uint8_t gCurrentScreen; 183 uint8_t gHomeScreen; 182 184 uint8_t gTrigger; 185 uint8_t gGlobalTrigger; 183 186 184 187 // TODO objects … … 202 205 fMainText->MakeEditable(false); 203 206 fMainText->MakeSelectable(false); 204 //fMainText->SetInsets(10, 10, 10, 10);207 fMainText->SetInsets(10, 10, 10, 10); 205 208 206 209 fInlineButton = new BButton("button", NULL); … … 208 211 BLayoutBuilder::Group<>(this, B_VERTICAL) 209 212 .SetInsets(0, 0, 0, B_USE_WINDOW_SPACING) 210 .Add(fMainText, 999) 211 .AddGroup(B_HORIZONTAL) 213 .Add(fMainText, 1) 214 .AddGroup(B_HORIZONTAL, B_USE_DEFAULT_SPACING, 0) 215 .GetLayout(&fLayout) 212 216 .AddGlue() 213 217 .Add(fInlineButton) 214 218 .AddGlue() 215 219 .End() 216 .AddGlue(0)217 220 .End(); 218 221 } … … 228 231 } 229 232 233 void SetButtonVisible(bool visible) 234 { 235 int32 index = fLayout->IndexOfView(fInlineButton); 236 fLayout->ItemAt(index)->SetVisible(visible); 237 } 238 230 239 void SetMainText(const std::string& text) 231 240 { 232 241 Lock(); 233 fInlineButton->Hide();242 SetButtonVisible(false); 234 243 fMainText->SetText(""); 235 244 … … 267 276 break; 268 277 } 278 case '{': 279 { 280 text_run_array runs; 281 runs.count = 1; 282 runs.runs->font = be_plain_font; 283 runs.runs->offset = 0; 284 runs.runs->color = make_color(0, 0, 0); 285 fMainText->Insert(decoded, &runs); 286 decoded = ""; 287 cursor += HandleConditional(message, cursor); 288 break; 289 } 269 290 case '@': 270 291 case '$': 271 292 // @ Gender mark (print an e if the player identifies as female) 272 293 // $ Plural mark (print an s if the counter is plural) 273 printf( BOLD"%c" NORMAL, message[cursor]);294 printf(COLOR "%c" NORMAL, message[cursor]); 274 295 cursor++; 275 296 break; … … 291 312 } 292 313 314 int ParseInt(const std::string& message, int& cursor) 315 { 316 int v = 0; 317 while (isdigit(message[cursor])) { 318 v = v * 10 + message[cursor] - '0'; 319 cursor++; 320 } 321 322 return v; 323 } 324 325 int HandleConditional(const std::string& message, int cursor) 326 { 327 int icursor = cursor; 328 // {%f3|%m2~%m3} 329 cursor++; 330 if (message[cursor] != '%' || message[cursor + 1] != 'f') { 331 fprintf(stderr, "Unknwown message conditional\n"); 332 return 1; 333 } 334 335 cursor += 2; 336 337 int flagToCheck = ParseInt(message, cursor); 338 uint8_t valueToCheck = gVar8[flagToCheck]; 339 340 if (message[cursor] != '|') { 341 fprintf(stderr, "Unknwown message conditional action\n"); 342 return 1; 343 } 344 345 for(;;) { 346 if (!valueToCheck && message[cursor] == '|') 347 break; 348 if (valueToCheck && message[cursor] == '~') 349 break; 350 cursor++; 351 } 352 cursor++; 353 354 if (message[cursor] != '%' || message[cursor + 1] != 'm') { 355 fprintf(stderr, "Unknwown message output %c%c\n", message[cursor], message[cursor + 1]); 356 } 357 cursor += 2; 358 359 int messageToDisplay = ParseInt(message, cursor); 360 BString decodedMessage; 361 PrettyPrint(gRooms[gCurrentRoom].fMessages[messageToDisplay - 1], decodedMessage); 362 fMainText->Insert(decodedMessage); 363 364 do { 365 cursor++; 366 } while (message[cursor] != '}'); 367 cursor++; 368 369 return cursor - icursor; 370 } 371 293 372 int HandleHyperlink(const std::string& message, int cursor) 294 373 { … … 324 403 if (message[cursor] == 'o') { 325 404 fInlineButton->SetLabel("OK"); 326 fInlineButton->Show();405 SetButtonVisible(true); 327 406 int v = 0; 328 407 int i = 1; … … 334 413 return i + 1; 335 414 } else if (message[cursor] == '!') { 336 printf( BOLD"APPEND" NORMAL "\n");415 printf(COLOR "APPEND" NORMAL "\n"); 337 416 return 2; 338 417 } else { 339 418 // TODO unknown escape sequence 340 fprintf(stderr, "ERROR: unknown escape sequence %c ", message[cursor]);419 fprintf(stderr, "ERROR: unknown escape sequence %c\n", message[cursor]); 341 420 return 2; 342 421 } … … 346 425 HyperTextView* fMainText; 347 426 BButton* fInlineButton; 427 BGroupLayout* fLayout; 348 428 BPrivate::BTextEncoding fDecoder; 349 429 }; … … 375 455 bool runNextLine = true; 376 456 int line = 0; 377 while (runNextLine) { 457 while (runNextLine && (line < gRooms[0].fScripts.size())) { 458 printf("[%02x:%02x] ", 0, line); 459 disassemble(gRooms[0].fScripts[line]); 378 460 runNextLine = RunScriptLine(gRooms[0].fScripts[line]); 379 461 line++; … … 388 470 int line = 0; 389 471 bool runNextLine = true; 390 while (runNextLine) { 472 printf("\nTRIGGER: %02x\n", gTrigger); 473 gCurrentScreen = gHomeScreen; 474 while (runNextLine && (line < gRooms[0].fScripts.size())) { 475 printf("[%02x:%02x] ", 0, line); 476 disassemble(gRooms[0].fScripts[line]); 391 477 runNextLine = RunScriptLine(gRooms[0].fScripts[line]); 392 478 line++; 393 479 } 480 puts("---"); 394 481 line = 0; 395 while (runNextLine) { 482 while (runNextLine && (line < gRooms[gCurrentRoom].fScripts.size())) { 483 printf("[%02x:%02x] ", gCurrentRoom, line); 484 disassemble(gRooms[gCurrentRoom].fScripts[line]); 396 485 runNextLine = RunScriptLine(gRooms[gCurrentRoom].fScripts[line]); 397 486 line++; … … 414 503 { 415 504 done = true; 505 break; 506 } 507 case 0x01: 508 { 509 uint8_t varAddress = script[pc++]; 510 if (gVar8[varAddress] != 0) { 511 continue; 512 } else { 513 done = true; 514 runNextLine = true; 515 } 516 break; 517 } 518 case 0x03: 519 { 520 uint8_t varAddress = script[pc++]; 521 if (gVar1[varAddress] == 0) { 522 continue; 523 } else { 524 done = true; 525 runNextLine = true; 526 } 416 527 break; 417 528 } … … 427 538 runNextLine = true; 428 539 } 540 break; 429 541 } 430 542 case 0x0D: … … 432 544 uint8_t eventToCheck = script[pc++]; 433 545 if (gTrigger == eventToCheck) { 434 fprintf(stderr, "unknown param to 0D: %02x\n", script[pc++]); 435 disassemble(script); 546 fprintf(stderr, " unknown param to 0D: %02x\n", script[pc++]); 436 547 continue; 437 548 } else { … … 445 556 uint8_t eventToCheck = script[pc++]; 446 557 // FIXME is it really gTrigger here, or should it be something else? 447 if (gTrigger == eventToCheck) 558 if (gGlobalTrigger == eventToCheck) { 559 gGlobalTrigger++; 448 560 continue; 449 else {561 } else { 450 562 done = true; 451 563 runNextLine = true; … … 453 565 break; 454 566 } 567 case 0x7E: 455 568 case 0x7F: 456 569 { 457 570 // FIXME figure this out 458 pc++; 571 break; 572 } 573 case 0x81: 574 { 575 uint8_t varAddress = script[pc++]; 576 gVar8[varAddress]++; 577 break; 578 } 579 case 0x83: 580 { 581 uint8_t varAddress = script[pc++]; 582 gVar1[varAddress] = true; 459 583 break; 460 584 } … … 467 591 break; 468 592 } 593 case 0x8A: 594 { 595 uint8_t varAddress = script[pc++]; 596 uint16_t varValue = script[pc++]; 597 varValue = varValue | (script[pc++] << 8); 598 gVar16[varAddress] -= varValue; 599 break; 600 } 469 601 case 0x8F: 470 602 { … … 479 611 case 0x93: 480 612 { 481 gCurrentScreen = script[pc++]; 613 gHomeScreen = script[pc++]; 614 gCurrentScreen = gHomeScreen; 482 615 break; 483 616 } … … 489 622 break; 490 623 } 624 case 0xA0: 625 { 626 // FIXME: the global hooks are always evaluated anyways? 627 pc += 3; 628 break; 629 } 630 case 0xFC: 631 { 632 printf("Game over"); 633 done = true; 634 break; 635 } 491 636 default: 492 637 fprintf(stderr, "ERROR: unknown opcode %02x at %04x\n", script[pc - 1], pc - 1); 493 disassemble(script); 638 for (int k = 0; k < script.size(); k++) { 639 if (k == pc - 1) 640 printf("*"); 641 printf("%02x ", script[k]); 642 } 643 puts(""); 494 644 done = true; 495 645 break; … … 683 833 684 834 // TODO how many variables are there? 835 gVar1.resize(16); 685 836 gVar8.resize(16); 686 837 gVar16.resize(16); 687 838 688 /*689 839 int i = 0; 690 840 for (const auto& room: gRooms) { … … 694 844 for (auto text: room.fMessages) { 695 845 printf("------ SCREEN %d -------\n", j + 1); 696 pr ettyPrint(text);846 printf("%s\n", text.c_str()); 697 847 j++; 698 848 } 699 849 850 /* 700 851 j = 0; 701 852 for (auto script: room.fScripts) { … … 704 855 j++; 705 856 } 857 */ 706 858 i++; 707 859 } 708 */709 860 710 861 Readingame app;
Note:
See TracChangeset
for help on using the changeset viewer.