diff --git a/lib/ocelot-brain b/lib/ocelot-brain index 2ef2cf3..fa3892b 160000 --- a/lib/ocelot-brain +++ b/lib/ocelot-brain @@ -1 +1 @@ -Subproject commit 2ef2cf3bda8f05688c9801d859c1ab16088bd4c4 +Subproject commit fa3892b7edbced1f6c9db04d14c2c216567909b9 diff --git a/sprites/window/tape/Back.png b/sprites/window/tape/Back.png new file mode 100644 index 0000000..c62c1ed Binary files /dev/null and b/sprites/window/tape/Back.png differ diff --git a/sprites/window/tape/BackPressed.png b/sprites/window/tape/BackPressed.png new file mode 100644 index 0000000..d1e66cc Binary files /dev/null and b/sprites/window/tape/BackPressed.png differ diff --git a/sprites/window/tape/Forward.png b/sprites/window/tape/Forward.png new file mode 100644 index 0000000..5a9aaf7 Binary files /dev/null and b/sprites/window/tape/Forward.png differ diff --git a/sprites/window/tape/ForwardPressed.png b/sprites/window/tape/ForwardPressed.png new file mode 100644 index 0000000..ed0d9e0 Binary files /dev/null and b/sprites/window/tape/ForwardPressed.png differ diff --git a/sprites/window/tape/Play.png b/sprites/window/tape/Play.png new file mode 100644 index 0000000..0ac140d Binary files /dev/null and b/sprites/window/tape/Play.png differ diff --git a/sprites/window/tape/PlayPressed.png b/sprites/window/tape/PlayPressed.png new file mode 100644 index 0000000..8393833 Binary files /dev/null and b/sprites/window/tape/PlayPressed.png differ diff --git a/sprites/window/tape/Screen.png b/sprites/window/tape/Screen.png new file mode 100644 index 0000000..b053a56 Binary files /dev/null and b/sprites/window/tape/Screen.png differ diff --git a/sprites/window/tape/Stop.png b/sprites/window/tape/Stop.png new file mode 100644 index 0000000..878f216 Binary files /dev/null and b/sprites/window/tape/Stop.png differ diff --git a/sprites/window/tape/StopPressed.png b/sprites/window/tape/StopPressed.png new file mode 100644 index 0000000..d557e87 Binary files /dev/null and b/sprites/window/tape/StopPressed.png differ diff --git a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png index 234a185..06a71c5 100644 Binary files a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png and b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.png differ diff --git a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt index 2c94834..3fb2cd6 100644 --- a/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt +++ b/src/main/resources/ocelot/desktop/images/spritesheet/spritesheet.txt @@ -1,175 +1,175 @@ BackgroundPattern 0 0 304 304 BarSegment 385 434 16 4 -Empty 327 572 16 16 -EmptySlot 305 597 18 18 +Empty 242 674 16 16 +EmptySlot 220 699 18 18 Knob 203 434 50 50 KnobCenter 254 434 50 50 KnobLimits 305 434 50 50 Loading 0 305 48 448 Logo 305 0 168 200 ShadowBorder 279 305 1 24 -ShadowCorner 202 572 24 24 -TabArrow 49 716 8 14 -blocks/Generic 344 572 16 16 +ShadowCorner 117 674 24 24 +TabArrow 134 628 8 14 +blocks/Generic 259 674 16 16 blocks/HologramEffect 287 314 4 4 -blocks/HologramProjector1Top 361 572 16 16 -blocks/HologramProjector2Top 378 572 16 16 -blocks/HologramProjectorSide 395 572 16 16 -buttons/BottomDrawerClose 324 597 18 18 -buttons/BottomDrawerOpen 343 597 18 18 +blocks/HologramProjector1Top 276 674 16 16 +blocks/HologramProjector2Top 293 674 16 16 +blocks/HologramProjectorSide 310 674 16 16 +buttons/BottomDrawerClose 239 699 18 18 +buttons/BottomDrawerOpen 258 699 18 18 buttons/OpenFMRadioCloseOff 404 445 7 8 buttons/OpenFMRadioCloseOn 412 445 7 8 buttons/OpenFMRadioRedstoneOff 359 445 8 8 buttons/OpenFMRadioRedstoneOn 368 445 8 8 -buttons/OpenFMRadioStartOff 227 572 24 24 -buttons/OpenFMRadioStartOn 252 572 24 24 -buttons/OpenFMRadioStopOff 277 572 24 24 -buttons/OpenFMRadioStopOn 302 572 24 24 -buttons/OpenFMRadioVolumeDownOff 58 716 10 10 -buttons/OpenFMRadioVolumeDownOn 69 716 10 10 -buttons/OpenFMRadioVolumeUpOff 80 716 10 10 -buttons/OpenFMRadioVolumeUpOn 91 716 10 10 -buttons/PowerOff 362 597 18 18 -buttons/PowerOn 381 597 18 18 -buttons/RackRelayOff 202 553 65 18 -buttons/RackRelayOn 268 553 65 18 -icons/Antenna 412 572 16 16 -icons/ArrowRight 429 572 16 16 -icons/AspectRatio 446 572 16 16 -icons/Book 463 572 16 16 -icons/ButtonCheck 202 630 17 17 -icons/ButtonClipboard 220 630 17 17 -icons/ButtonRandomize 238 630 17 17 -icons/CPU 480 572 16 16 -icons/Card 497 572 16 16 -icons/Close 49 683 15 14 -icons/Code 514 572 16 16 -icons/ComponentBus 531 572 16 16 -icons/Copy 548 572 16 16 -icons/Cross 565 572 16 16 -icons/Delete 582 572 16 16 -icons/DragLMB 400 597 21 14 -icons/DragRMB 422 597 21 14 -icons/EEPROM 599 572 16 16 -icons/Edit 616 572 16 16 -icons/Eject 633 572 16 16 -icons/File 650 572 16 16 -icons/Floppy 667 572 16 16 -icons/Folder 684 572 16 16 -icons/FolderSlash 701 572 16 16 -icons/Grid 236 597 22 22 -icons/GridOff 259 597 22 22 -icons/HDD 718 572 16 16 -icons/Help 735 572 16 16 -icons/Home 282 597 22 22 -icons/LMB 133 698 11 14 -icons/Label 752 572 16 16 -icons/LinesHorizontal 769 572 16 16 -icons/Link 786 572 16 16 -icons/LinkSlash 803 572 16 16 -icons/Memory 820 572 16 16 -icons/Microchip 837 572 16 16 -icons/NA 854 572 16 16 -icons/NotificationError 157 698 11 11 -icons/NotificationInfo 169 698 11 11 -icons/NotificationWarning 181 698 11 11 -icons/Ocelot 871 572 16 16 -icons/Pin 88 698 14 14 -icons/Plus 888 572 16 16 -icons/Power 905 572 16 16 -icons/RMB 145 698 11 14 -icons/Restart 922 572 16 16 -icons/Save 939 572 16 16 -icons/SaveAs 956 572 16 16 -icons/Server 973 572 16 16 -icons/SettingsSound 49 698 12 17 -icons/SettingsSystem 62 698 12 17 -icons/SettingsUI 75 698 12 17 -icons/Tier0 990 572 16 16 -icons/Tier1 1007 572 16 16 -icons/Tier2 334 553 16 16 -icons/Tiers 351 553 16 16 -icons/Unpin 103 698 14 14 -icons/WaveLFSR 969 655 24 10 -icons/WaveNoise 994 655 24 10 -icons/WaveSawtooth 49 672 24 10 -icons/WaveSine 74 672 24 10 -icons/WaveSquare 99 672 24 10 -icons/WaveTriangle 124 672 24 10 -icons/Window 368 553 16 16 +buttons/OpenFMRadioStartOff 142 674 24 24 +buttons/OpenFMRadioStartOn 167 674 24 24 +buttons/OpenFMRadioStopOff 192 674 24 24 +buttons/OpenFMRadioStopOn 217 674 24 24 +buttons/OpenFMRadioVolumeDownOff 143 628 10 10 +buttons/OpenFMRadioVolumeDownOn 154 628 10 10 +buttons/OpenFMRadioVolumeUpOff 165 628 10 10 +buttons/OpenFMRadioVolumeUpOn 176 628 10 10 +buttons/PowerOff 277 699 18 18 +buttons/PowerOn 296 699 18 18 +buttons/RackRelayOff 117 655 65 18 +buttons/RackRelayOn 183 655 65 18 +icons/Antenna 327 674 16 16 +icons/ArrowRight 344 674 16 16 +icons/AspectRatio 361 674 16 16 +icons/Book 378 674 16 16 +icons/ButtonCheck 117 732 17 17 +icons/ButtonClipboard 135 732 17 17 +icons/ButtonRandomize 153 732 17 17 +icons/CPU 395 674 16 16 +icons/Card 412 674 16 16 +icons/Close 134 595 15 14 +icons/Code 429 674 16 16 +icons/ComponentBus 446 674 16 16 +icons/Copy 463 674 16 16 +icons/Cross 480 674 16 16 +icons/Delete 497 674 16 16 +icons/DragLMB 483 699 21 14 +icons/DragRMB 505 699 21 14 +icons/EEPROM 514 674 16 16 +icons/Edit 531 674 16 16 +icons/Eject 548 674 16 16 +icons/File 565 674 16 16 +icons/Floppy 582 674 16 16 +icons/Folder 599 674 16 16 +icons/FolderSlash 616 674 16 16 +icons/Grid 151 699 22 22 +icons/GridOff 174 699 22 22 +icons/HDD 633 674 16 16 +icons/Help 650 674 16 16 +icons/Home 197 699 22 22 +icons/LMB 218 610 11 14 +icons/Label 667 674 16 16 +icons/LinesHorizontal 684 674 16 16 +icons/Link 701 674 16 16 +icons/LinkSlash 718 674 16 16 +icons/Memory 735 674 16 16 +icons/Microchip 752 674 16 16 +icons/NA 769 674 16 16 +icons/NotificationError 242 610 11 11 +icons/NotificationInfo 254 610 11 11 +icons/NotificationWarning 266 610 11 11 +icons/Ocelot 786 674 16 16 +icons/Pin 173 610 14 14 +icons/Plus 803 674 16 16 +icons/Power 820 674 16 16 +icons/RMB 230 610 11 14 +icons/Restart 837 674 16 16 +icons/Save 854 674 16 16 +icons/SaveAs 871 674 16 16 +icons/Server 888 674 16 16 +icons/SettingsSound 134 610 12 17 +icons/SettingsSystem 147 610 12 17 +icons/SettingsUI 160 610 12 17 +icons/Tier0 905 674 16 16 +icons/Tier1 922 674 16 16 +icons/Tier2 939 674 16 16 +icons/Tiers 956 674 16 16 +icons/Unpin 188 610 14 14 +icons/WaveLFSR 884 567 24 10 +icons/WaveNoise 909 567 24 10 +icons/WaveSawtooth 934 567 24 10 +icons/WaveSine 959 567 24 10 +icons/WaveSquare 984 567 24 10 +icons/WaveTriangle 134 584 24 10 +icons/Window 973 674 16 16 icons/WireArrowLeft 281 305 4 8 icons/WireArrowRight 286 305 4 8 -items/APU0 134 553 16 96 -items/APU1 151 553 16 96 -items/APU2 168 553 16 96 -items/CPU0 385 553 16 16 -items/CPU1 402 553 16 16 -items/CPU2 419 553 16 16 -items/CardBase 436 553 16 16 -items/CircuitBoard 453 553 16 16 -items/ComponentBus0 470 553 16 16 -items/ComponentBus1 487 553 16 16 -items/ComponentBus2 504 553 16 16 -items/ComponentBus3 521 553 16 16 +items/APU0 49 655 16 96 +items/APU1 66 655 16 96 +items/APU2 83 655 16 96 +items/CPU0 990 674 16 16 +items/CPU1 1007 674 16 16 +items/CPU2 249 655 16 16 +items/CardBase 266 655 16 16 +items/CircuitBoard 283 655 16 16 +items/ComponentBus0 300 655 16 16 +items/ComponentBus1 317 655 16 16 +items/ComponentBus2 334 655 16 16 +items/ComponentBus3 351 655 16 16 items/DataCard0 49 526 16 128 items/DataCard1 66 526 16 128 items/DataCard2 83 526 16 128 -items/DebugCard 538 553 16 16 -items/DiskDriveMountable 555 553 16 16 -items/EEPROM 572 553 16 16 -items/FloppyDisk_dyeBlack 589 553 16 16 -items/FloppyDisk_dyeBlue 606 553 16 16 -items/FloppyDisk_dyeBrown 623 553 16 16 -items/FloppyDisk_dyeCyan 640 553 16 16 -items/FloppyDisk_dyeGray 657 553 16 16 -items/FloppyDisk_dyeGreen 674 553 16 16 -items/FloppyDisk_dyeLightBlue 691 553 16 16 -items/FloppyDisk_dyeLightGray 708 553 16 16 -items/FloppyDisk_dyeLime 725 553 16 16 -items/FloppyDisk_dyeMagenta 742 553 16 16 -items/FloppyDisk_dyeOrange 759 553 16 16 -items/FloppyDisk_dyePink 776 553 16 16 -items/FloppyDisk_dyePurple 793 553 16 16 -items/FloppyDisk_dyeRed 810 553 16 16 -items/FloppyDisk_dyeWhite 827 553 16 16 -items/FloppyDisk_dyeYellow 844 553 16 16 -items/GraphicsCard0 861 553 16 16 -items/GraphicsCard1 878 553 16 16 -items/GraphicsCard2 895 553 16 16 -items/HardDiskDrive0 912 553 16 16 -items/HardDiskDrive1 929 553 16 16 -items/HardDiskDrive2 946 553 16 16 -items/InternetCard 202 597 16 32 -items/LinkedCard 185 553 16 96 -items/Memory0 963 553 16 16 -items/Memory1 980 553 16 16 -items/Memory2 997 553 16 16 -items/Memory3 201 526 16 16 -items/Memory4 218 526 16 16 -items/Memory5 235 526 16 16 -items/Memory6 252 526 16 16 -items/NetworkCard 269 526 16 16 +items/DebugCard 368 655 16 16 +items/DiskDriveMountable 385 655 16 16 +items/EEPROM 402 655 16 16 +items/FloppyDisk_dyeBlack 419 655 16 16 +items/FloppyDisk_dyeBlue 436 655 16 16 +items/FloppyDisk_dyeBrown 453 655 16 16 +items/FloppyDisk_dyeCyan 470 655 16 16 +items/FloppyDisk_dyeGray 487 655 16 16 +items/FloppyDisk_dyeGreen 504 655 16 16 +items/FloppyDisk_dyeLightBlue 521 655 16 16 +items/FloppyDisk_dyeLightGray 538 655 16 16 +items/FloppyDisk_dyeLime 555 655 16 16 +items/FloppyDisk_dyeMagenta 572 655 16 16 +items/FloppyDisk_dyeOrange 589 655 16 16 +items/FloppyDisk_dyePink 606 655 16 16 +items/FloppyDisk_dyePurple 623 655 16 16 +items/FloppyDisk_dyeRed 640 655 16 16 +items/FloppyDisk_dyeWhite 657 655 16 16 +items/FloppyDisk_dyeYellow 674 655 16 16 +items/GraphicsCard0 691 655 16 16 +items/GraphicsCard1 708 655 16 16 +items/GraphicsCard2 725 655 16 16 +items/HardDiskDrive0 742 655 16 16 +items/HardDiskDrive1 759 655 16 16 +items/HardDiskDrive2 776 655 16 16 +items/InternetCard 117 699 16 32 +items/LinkedCard 100 655 16 96 +items/Memory0 793 655 16 16 +items/Memory1 810 655 16 16 +items/Memory2 827 655 16 16 +items/Memory3 844 655 16 16 +items/Memory4 861 655 16 16 +items/Memory5 878 655 16 16 +items/Memory6 895 655 16 16 +items/NetworkCard 912 655 16 16 items/OcelotCard 100 526 16 128 -items/RedstoneCard0 286 526 16 16 -items/RedstoneCard1 303 526 16 16 -items/SelfDestructingCard 219 597 16 32 -items/Server0 320 526 16 16 -items/Server1 337 526 16 16 -items/Server2 354 526 16 16 -items/Server3 371 526 16 16 +items/RedstoneCard0 929 655 16 16 +items/RedstoneCard1 946 655 16 16 +items/SelfDestructingCard 134 699 16 32 +items/Server0 963 655 16 16 +items/Server1 980 655 16 16 +items/Server2 997 655 16 16 +items/Server3 201 540 16 16 items/SoundCard 117 526 16 128 -items/TapeCopper 388 526 16 16 -items/TapeDiamond 405 526 16 16 -items/TapeGold 422 526 16 16 -items/TapeGreg 439 526 16 16 -items/TapeIg 456 526 16 16 -items/TapeIron 473 526 16 16 -items/TapeNetherStar 490 526 16 16 -items/TapeSteel 507 526 16 16 -items/WirelessNetworkCard0 524 526 16 16 -items/WirelessNetworkCard1 541 526 16 16 -light-panel/BookmarkLeft 950 655 18 14 -light-panel/BookmarkRight 256 630 20 14 +items/TapeCopper 218 540 16 16 +items/TapeDiamond 235 540 16 16 +items/TapeGold 252 540 16 16 +items/TapeGreg 269 540 16 16 +items/TapeIg 286 540 16 16 +items/TapeIron 303 540 16 16 +items/TapeNetherStar 320 540 16 16 +items/TapeSteel 337 540 16 16 +items/WirelessNetworkCard0 354 540 16 16 +items/WirelessNetworkCard1 371 540 16 16 +light-panel/BookmarkLeft 865 567 18 14 +light-panel/BookmarkRight 171 732 20 14 light-panel/BorderB 292 314 4 4 light-panel/BorderL 382 314 4 2 light-panel/BorderR 297 314 4 4 @@ -181,88 +181,88 @@ light-panel/CornerTR 322 314 4 4 light-panel/Fill 285 325 2 2 light-panel/Vent 356 434 2 38 nodes/Cable 377 445 8 8 -nodes/Camera 558 526 16 16 -nodes/Chest 118 698 14 14 -nodes/HologramProjector0 575 526 16 16 -nodes/HologramProjector1 592 526 16 16 -nodes/IronNoteBlock 609 526 16 16 -nodes/Lamp 626 526 16 16 -nodes/LampFrame 643 526 16 16 +nodes/Camera 388 540 16 16 +nodes/Chest 203 610 14 14 +nodes/HologramProjector0 405 540 16 16 +nodes/HologramProjector1 422 540 16 16 +nodes/IronNoteBlock 439 540 16 16 +nodes/Lamp 456 540 16 16 +nodes/LampFrame 473 540 16 16 nodes/LampGlow 49 305 128 128 -nodes/NewNode 660 526 16 16 -nodes/NoteBlock 677 526 16 16 -nodes/OpenFMRadio 694 526 16 16 -nodes/Relay 711 526 16 16 -nodes/TapeDrive 728 526 16 16 -nodes/computer/Default 745 526 16 16 -nodes/computer/DiskActivity 762 526 16 16 -nodes/computer/Error 779 526 16 16 -nodes/computer/On 796 526 16 16 -nodes/disk-drive/Default 813 526 16 16 -nodes/disk-drive/DiskActivity 830 526 16 16 -nodes/disk-drive/Floppy 847 526 16 16 -nodes/microcontroller/Default 864 526 16 16 -nodes/microcontroller/Error 881 526 16 16 -nodes/microcontroller/On 898 526 16 16 -nodes/rack/Default 915 526 16 16 -nodes/rack/Empty 932 526 16 16 -nodes/rack/drive/0/Default 949 526 16 16 -nodes/rack/drive/0/DiskActivity 966 526 16 16 -nodes/rack/drive/0/Floppy 983 526 16 16 -nodes/rack/drive/1/Default 1000 526 16 16 -nodes/rack/drive/1/DiskActivity 49 655 16 16 -nodes/rack/drive/1/Floppy 66 655 16 16 -nodes/rack/drive/2/Default 83 655 16 16 -nodes/rack/drive/2/DiskActivity 100 655 16 16 -nodes/rack/drive/2/Floppy 117 655 16 16 -nodes/rack/drive/3/Default 134 655 16 16 -nodes/rack/drive/3/DiskActivity 151 655 16 16 -nodes/rack/drive/3/Floppy 168 655 16 16 -nodes/rack/drive/Floppy 185 655 16 16 -nodes/rack/server/0/Default 202 655 16 16 -nodes/rack/server/0/DiskActivity 219 655 16 16 -nodes/rack/server/0/Error 236 655 16 16 -nodes/rack/server/0/NetworkActivity 253 655 16 16 -nodes/rack/server/0/On 270 655 16 16 -nodes/rack/server/1/Default 287 655 16 16 -nodes/rack/server/1/DiskActivity 304 655 16 16 -nodes/rack/server/1/Error 321 655 16 16 -nodes/rack/server/1/NetworkActivity 338 655 16 16 -nodes/rack/server/1/On 355 655 16 16 -nodes/rack/server/2/Default 372 655 16 16 -nodes/rack/server/2/DiskActivity 389 655 16 16 -nodes/rack/server/2/Error 406 655 16 16 -nodes/rack/server/2/NetworkActivity 423 655 16 16 -nodes/rack/server/2/On 440 655 16 16 -nodes/rack/server/3/Default 457 655 16 16 -nodes/rack/server/3/DiskActivity 474 655 16 16 -nodes/rack/server/3/Error 491 655 16 16 -nodes/rack/server/3/NetworkActivity 508 655 16 16 -nodes/rack/server/3/On 525 655 16 16 -nodes/raid/0/DiskActivity 542 655 16 16 -nodes/raid/0/Error 559 655 16 16 -nodes/raid/1/DiskActivity 576 655 16 16 -nodes/raid/1/Error 593 655 16 16 -nodes/raid/2/DiskActivity 610 655 16 16 -nodes/raid/2/Error 627 655 16 16 -nodes/raid/Default 644 655 16 16 -nodes/screen/BottomLeft 661 655 16 16 -nodes/screen/BottomMiddle 678 655 16 16 -nodes/screen/BottomRight 695 655 16 16 -nodes/screen/ColumnBottom 712 655 16 16 -nodes/screen/ColumnMiddle 729 655 16 16 -nodes/screen/ColumnTop 746 655 16 16 -nodes/screen/Middle 763 655 16 16 -nodes/screen/MiddleLeft 780 655 16 16 -nodes/screen/MiddleRight 797 655 16 16 -nodes/screen/PowerOnOverlay 814 655 16 16 -nodes/screen/RowLeft 831 655 16 16 -nodes/screen/RowMiddle 848 655 16 16 -nodes/screen/RowRight 865 655 16 16 -nodes/screen/Standalone 882 655 16 16 -nodes/screen/TopLeft 899 655 16 16 -nodes/screen/TopMiddle 916 655 16 16 -nodes/screen/TopRight 933 655 16 16 +nodes/NewNode 490 540 16 16 +nodes/NoteBlock 507 540 16 16 +nodes/OpenFMRadio 524 540 16 16 +nodes/Relay 541 540 16 16 +nodes/TapeDrive 558 540 16 16 +nodes/computer/Default 575 540 16 16 +nodes/computer/DiskActivity 592 540 16 16 +nodes/computer/Error 609 540 16 16 +nodes/computer/On 626 540 16 16 +nodes/disk-drive/Default 643 540 16 16 +nodes/disk-drive/DiskActivity 660 540 16 16 +nodes/disk-drive/Floppy 677 540 16 16 +nodes/microcontroller/Default 694 540 16 16 +nodes/microcontroller/Error 711 540 16 16 +nodes/microcontroller/On 728 540 16 16 +nodes/rack/Default 745 540 16 16 +nodes/rack/Empty 762 540 16 16 +nodes/rack/drive/0/Default 779 540 16 16 +nodes/rack/drive/0/DiskActivity 796 540 16 16 +nodes/rack/drive/0/Floppy 813 540 16 16 +nodes/rack/drive/1/Default 830 540 16 16 +nodes/rack/drive/1/DiskActivity 847 540 16 16 +nodes/rack/drive/1/Floppy 864 540 16 16 +nodes/rack/drive/2/Default 881 540 16 16 +nodes/rack/drive/2/DiskActivity 898 540 16 16 +nodes/rack/drive/2/Floppy 915 540 16 16 +nodes/rack/drive/3/Default 932 540 16 16 +nodes/rack/drive/3/DiskActivity 949 540 16 16 +nodes/rack/drive/3/Floppy 966 540 16 16 +nodes/rack/drive/Floppy 983 540 16 16 +nodes/rack/server/0/Default 1000 540 16 16 +nodes/rack/server/0/DiskActivity 134 567 16 16 +nodes/rack/server/0/Error 151 567 16 16 +nodes/rack/server/0/NetworkActivity 168 567 16 16 +nodes/rack/server/0/On 185 567 16 16 +nodes/rack/server/1/Default 202 567 16 16 +nodes/rack/server/1/DiskActivity 219 567 16 16 +nodes/rack/server/1/Error 236 567 16 16 +nodes/rack/server/1/NetworkActivity 253 567 16 16 +nodes/rack/server/1/On 270 567 16 16 +nodes/rack/server/2/Default 287 567 16 16 +nodes/rack/server/2/DiskActivity 304 567 16 16 +nodes/rack/server/2/Error 321 567 16 16 +nodes/rack/server/2/NetworkActivity 338 567 16 16 +nodes/rack/server/2/On 355 567 16 16 +nodes/rack/server/3/Default 372 567 16 16 +nodes/rack/server/3/DiskActivity 389 567 16 16 +nodes/rack/server/3/Error 406 567 16 16 +nodes/rack/server/3/NetworkActivity 423 567 16 16 +nodes/rack/server/3/On 440 567 16 16 +nodes/raid/0/DiskActivity 457 567 16 16 +nodes/raid/0/Error 474 567 16 16 +nodes/raid/1/DiskActivity 491 567 16 16 +nodes/raid/1/Error 508 567 16 16 +nodes/raid/2/DiskActivity 525 567 16 16 +nodes/raid/2/Error 542 567 16 16 +nodes/raid/Default 559 567 16 16 +nodes/screen/BottomLeft 576 567 16 16 +nodes/screen/BottomMiddle 593 567 16 16 +nodes/screen/BottomRight 610 567 16 16 +nodes/screen/ColumnBottom 627 567 16 16 +nodes/screen/ColumnMiddle 644 567 16 16 +nodes/screen/ColumnTop 661 567 16 16 +nodes/screen/Middle 678 567 16 16 +nodes/screen/MiddleLeft 695 567 16 16 +nodes/screen/MiddleRight 712 567 16 16 +nodes/screen/PowerOnOverlay 729 567 16 16 +nodes/screen/RowLeft 746 567 16 16 +nodes/screen/RowMiddle 763 567 16 16 +nodes/screen/RowRight 780 567 16 16 +nodes/screen/Standalone 797 567 16 16 +nodes/screen/TopLeft 814 567 16 16 +nodes/screen/TopMiddle 831 567 16 16 +nodes/screen/TopRight 848 567 16 16 panel/BorderB 327 314 4 4 panel/BorderL 387 314 4 2 panel/BorderR 332 314 4 4 @@ -306,4 +306,13 @@ window/rack/SideConnector 291 319 1 3 window/rack/SideLeft 293 319 1 3 window/rack/SideRight 295 319 1 3 window/rack/SideTop 297 319 1 3 -window/raid/Slots 134 526 66 26 +window/raid/Slots 134 540 66 26 +window/tape/Back 315 699 20 15 +window/tape/BackPressed 336 699 20 15 +window/tape/Forward 357 699 20 15 +window/tape/ForwardPressed 378 699 20 15 +window/tape/Play 399 699 20 15 +window/tape/PlayPressed 420 699 20 15 +window/tape/Screen 134 526 146 13 +window/tape/Stop 441 699 20 15 +window/tape/StopPressed 462 699 20 15 diff --git a/src/main/resources/ocelot/desktop/sounds/machine/tape_button.ogg b/src/main/resources/ocelot/desktop/sounds/machine/tape_button.ogg new file mode 100644 index 0000000..56ef81c Binary files /dev/null and b/src/main/resources/ocelot/desktop/sounds/machine/tape_button.ogg differ diff --git a/src/main/resources/ocelot/desktop/sounds/machine/tape_eject.ogg b/src/main/resources/ocelot/desktop/sounds/machine/tape_eject.ogg new file mode 100644 index 0000000..475ab98 Binary files /dev/null and b/src/main/resources/ocelot/desktop/sounds/machine/tape_eject.ogg differ diff --git a/src/main/resources/ocelot/desktop/sounds/machine/tape_insert.ogg b/src/main/resources/ocelot/desktop/sounds/machine/tape_insert.ogg new file mode 100644 index 0000000..c3d76a9 Binary files /dev/null and b/src/main/resources/ocelot/desktop/sounds/machine/tape_insert.ogg differ diff --git a/src/main/resources/ocelot/desktop/sounds/machine/tape_rewind.ogg b/src/main/resources/ocelot/desktop/sounds/machine/tape_rewind.ogg new file mode 100644 index 0000000..aab934e Binary files /dev/null and b/src/main/resources/ocelot/desktop/sounds/machine/tape_rewind.ogg differ diff --git a/src/main/scala/ocelot/desktop/audio/SoundBuffers.scala b/src/main/scala/ocelot/desktop/audio/SoundBuffers.scala index 7f202ac..1ac05a3 100644 --- a/src/main/scala/ocelot/desktop/audio/SoundBuffers.scala +++ b/src/main/scala/ocelot/desktop/audio/SoundBuffers.scala @@ -24,8 +24,15 @@ object SoundBuffers extends Resource { load("/ocelot/desktop/sounds/machine/hdd_access5.ogg"), load("/ocelot/desktop/sounds/machine/hdd_access6.ogg"), ) + + lazy val MachineTapeButton: SoundBuffer = load("/ocelot/desktop/sounds/machine/tape_button.ogg") + lazy val MachineTapeEject: SoundBuffer = load("/ocelot/desktop/sounds/machine/tape_eject.ogg") + lazy val MachineTapeInsert: SoundBuffer = load("/ocelot/desktop/sounds/machine/tape_insert.ogg") + lazy val MachineTapeRewind: SoundBuffer = load("/ocelot/desktop/sounds/machine/tape_rewind.ogg") + lazy val InterfaceClick: SoundBuffer = load("/ocelot/desktop/sounds/interface/click.ogg") lazy val InterfaceTick: SoundBuffer = load("/ocelot/desktop/sounds/interface/tick.ogg") + lazy val MinecraftClick: SoundBuffer = load("/ocelot/desktop/sounds/minecraft/click.ogg") lazy val MinecraftExplosion: SoundBuffer = load("/ocelot/desktop/sounds/minecraft/explosion.ogg") diff --git a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala index 8db0c4d..240cbe6 100644 --- a/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala +++ b/src/main/scala/ocelot/desktop/node/nodes/TapeDriveNode.scala @@ -1,22 +1,47 @@ package ocelot.desktop.node.nodes +import ocelot.desktop.audio.{Audio, SoundBuffers, SoundCategory, SoundSource} import ocelot.desktop.inventory.SyncedInventory import ocelot.desktop.inventory.item.TapeItem import ocelot.desktop.node.{EntityNode, LabeledEntityNode, WindowedNode} import ocelot.desktop.windows.TapeDriveWindow -import totoro.ocelot.brain.entity.TapeDrive +import totoro.ocelot.brain.entity.{TapeDrive, TapeDriveState} -class TapeDriveNode(entity: TapeDrive) - extends EntityNode(entity) +class TapeDriveNode(val tapeDrive: TapeDrive) + extends EntityNode(tapeDrive) with SyncedInventory with LabeledEntityNode with WindowedNode[TapeDriveWindow] { override def icon: String = "nodes/TapeDrive" + private lazy val soundTapeRewind: SoundSource = SoundSource.fromBuffer( + SoundBuffers.MachineTapeRewind, + SoundCategory.Environment, + looping = true + ) + + override def update(): Unit = { + super.update() + + val isRewinding = tapeDrive.state.state == TapeDriveState.State.Rewinding || tapeDrive.state.state == TapeDriveState.State.Forwarding + + if (!isRewinding && soundTapeRewind.isPlaying) { + soundTapeRewind.stop() + } + else if (isRewinding && !soundTapeRewind.isPlaying && !Audio.isDisabled) { + soundTapeRewind.play() + } + } + + // -------------------------------- Inventory -------------------------------- + override type I = TapeItem - override def brainInventory: TapeDrive = entity + override def brainInventory: TapeDrive = tapeDrive + + + // -------------------------------- Windowed -------------------------------- override protected def createWindow(): TapeDriveWindow = new TapeDriveWindow(this) } diff --git a/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala b/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala index 0ab5483..d928332 100644 --- a/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala +++ b/src/main/scala/ocelot/desktop/windows/TapeDriveWindow.scala @@ -1,19 +1,120 @@ package ocelot.desktop.windows -import ocelot.desktop.geometry.Padding2D +import ocelot.desktop.audio.{SoundBuffers, SoundCategory, SoundSource} +import ocelot.desktop.color.{Color, RGBAColorNorm} +import ocelot.desktop.geometry.{Padding2D, Size2D} +import ocelot.desktop.graphics.Graphics import ocelot.desktop.inventory.item.TapeItem import ocelot.desktop.node.nodes.TapeDriveNode -import ocelot.desktop.ui.widget.PaddingBox +import ocelot.desktop.ui.layout.{AlignItems, Layout, LinearLayout} import ocelot.desktop.ui.widget.slot.SlotWidget import ocelot.desktop.ui.widget.window.PanelWindow +import ocelot.desktop.ui.widget.{IconButton, PaddingBox, Widget} +import ocelot.desktop.util.Orientation +import totoro.ocelot.brain.entity.TapeDriveState -class TapeDriveWindow(host: TapeDriveNode) extends PanelWindow { - override protected def title: String = s"Tape Drive ${host.entity.node.address}" +class TapeDriveWindow(val tapeDriveNode: TapeDriveNode) extends PanelWindow { + private val playbackOverlayColor: RGBAColorNorm = RGBAColorNorm(1, 1, 1, 0.01f) - override def titleMaxLength: Int = 16 + private lazy val tapeButtonSound: SoundSource = SoundSource.fromBuffer(SoundBuffers.MachineTapeButton, SoundCategory.Environment) + + override protected def title: String = s"Tape Drive ${tapeDriveNode.tapeDrive.node.address}" + + override def titleMaxLength: Int = 22 setInner(new PaddingBox( - new SlotWidget[TapeItem](host.Slot(0)), - Padding2D(8, 64, 8, 64) + new Widget { + override protected val layout: Layout = new LinearLayout(this, orientation = Orientation.Vertical, gap = 16, alignItems = AlignItems.Center) + + // Screen + children :+= new Widget { + + override def minimumSize: Size2D = Size2D(292, 26) + override def maximumSize: Size2D = minimumSize + + override def draw(g: Graphics): Unit = { + // Screen background + g.sprite( + "window/tape/Screen", + bounds + ) + + // A barely noticeable overlay showing the playback progress + // Btw computronix doesn't have this feature, so I won't ruin the canon and make it too annoying + val playedPart = tapeDriveNode.tapeDrive.position.toFloat / tapeDriveNode.tapeDrive.size.toFloat + + if (playedPart > 0) { + val offset = 2 + + g.rect( + position.x + offset, + position.y + offset, + (width - offset * 2) * playedPart, + height - offset * 2, + playbackOverlayColor + ) + } + + // Tape label name + val label = tapeDriveNode.tapeDrive.tape.map(_.label) + val text = if (label.isDefined && label.get.nonEmpty) label.get else "Unnamed tape" + val textWidth = text.map(g.font.charWidth(_)).sum + val textHeight = 16 + + g.background = Color.Transparent + g.foreground = Color.White + g.text(position.x + width / 2 - textWidth / 2, position.y + height / 2 - textHeight / 2, text) + } + } + + // Slot + children :+= new SlotWidget[TapeItem](tapeDriveNode.Slot(0)) + + // Buttons + children :+= new Widget { + override protected val layout: Layout = new LinearLayout(this, gap = 0) + + def addButton(sprite: String, pressedState: TapeDriveState.State): Unit = { + children :+= new IconButton( + s"window/tape/$sprite", + s"window/tape/${sprite}Pressed", + mode = IconButton.Mode.Switch, + sizeMultiplier = 2, + model = IconButton.ReadOnlyModel(tapeDriveNode.tapeDrive.state.state == pressedState), + ) { + override def onPressed(): Unit = tapeDriveNode.tapeDrive.state.state = pressedState + + protected override def clickSoundSource: SoundSource = tapeButtonSound + + override def update(): Unit = { + model.pressed = tapeDriveNode.tapeDrive.state.state == pressedState + + super.update() + } + } + } + + addButton( + "Back", + TapeDriveState.State.Rewinding + ) + + addButton( + "Play", + TapeDriveState.State.Playing + ) + + addButton( + "Stop", + TapeDriveState.State.Stopped + ) + + addButton( + "Forward", + TapeDriveState.State.Forwarding + ) + } + }, + Padding2D(10, 20, 10, 20) )) }