various fixes

This commit is contained in:
minjaesong
2022-03-16 12:50:43 +09:00
parent 40a7c6876a
commit 52f0dfdeb9
17 changed files with 116 additions and 115 deletions

Binary file not shown.

View File

@@ -19,6 +19,7 @@ import net.torvald.terrarum.modulebasegame.gameactors.FixtureInventory
import net.torvald.terrarum.ui.Toolkit
import net.torvald.terrarum.ui.UICanvas
import net.torvald.tsvm.*
import net.torvald.tsvm.peripheral.AdapterConfig
import net.torvald.tsvm.peripheral.GraphicsAdapter
import net.torvald.tsvm.peripheral.ReferenceGraphicsAdapter
import net.torvald.tsvm.peripheral.VMProgramRom
@@ -28,11 +29,15 @@ import net.torvald.tsvm.peripheral.VMProgramRom
*/
class FixtureHomeComputer : FixtureBase {
private val vm = VM(0x200000, TheRealWorld(), arrayOf(
// TODO: write serialiser for TSVM && allow mods to have their own serialiser
private val vm = VM(ModMgr.getGdxFile("dwarventech", "bios").path(), 0x200000, TheRealWorld(), arrayOf(
VMProgramRom(ModMgr.getGdxFile("dwarventech", "bios/tsvmbios.js").path())
))
private val vmRunner: VMRunner
private val coroutineJob: Job
@Transient private lateinit var vmRunner: VMRunner
@Transient private lateinit var coroutineJob: Job
@Transient private var vmStarted = false
@Transient private lateinit var disposableObj: Disposable
constructor() : super(
BlockBox(BlockBox.NO_COLLISION, 1, 1),
@@ -49,7 +54,7 @@ class FixtureHomeComputer : FixtureBase {
actorValue[AVKey.BASEMASS] = 20.0
val gpu = ReferenceGraphicsAdapter(ModMgr.getGdxFile("dwarventech", "gui").path(), vm)
val gpu = GraphicsAdapter(ModMgr.getGdxFile("dwarventech", "gui").path(), vm, GRAPHICSCONFIG)
// vm.getIO().blockTransferPorts[0].attachDevice(TestDiskDrive(vm, 0, ...))
vm.peripheralTable[1] = PeripheralEntry(
@@ -64,23 +69,66 @@ class FixtureHomeComputer : FixtureBase {
vm.getInputStream = { gpu.getInputStream() }
(mainUI as UIHomeComputer).vm = vm
(mainUI as UIHomeComputer).fixture = this
vmRunner = VMRunnerFactory(ModMgr.getGdxFile("dwarventech", "bios").path(), vm, "js")
coroutineJob = GlobalScope.launch {
vmRunner.executeCommand(vm.roms[0]!!.readAll())
}
}
fun startVM() {
if (!vmStarted) {
vmStarted = true
coroutineJob = GlobalScope.launch {
vmRunner.executeCommand(vm.roms[0]!!.readAll())
}
disposableObj = Disposable {
vmRunner.close()
coroutineJob.cancel("fixture disposal")
vm.dispose()
}
INGAME.disposables.add(disposableObj)
}
}
fun stopVM() {
if (vmStarted) {
vmStarted = false
INGAME.disposables.add(Disposable {
vmRunner.close()
coroutineJob.cancel("fixture disposal")
vm.dispose()
})
INGAME.disposables.remove(disposableObj)
}
}
override fun reload() {
super.reload()
val gpu = GraphicsAdapter(ModMgr.getGdxFile("dwarventech", "gui").path(), vm, GRAPHICSCONFIG)
// vm.getIO().blockTransferPorts[0].attachDevice(TestDiskDrive(vm, 0, ...))
vm.peripheralTable[1] = PeripheralEntry(
gpu,
GraphicsAdapter.VRAM_SIZE,
16,
0
)
vm.getPrintStream = { gpu.getPrintStream() }
vm.getErrorStream = { gpu.getErrorStream() }
vm.getInputStream = { gpu.getInputStream() }
(mainUI as UIHomeComputer).vm = vm
(mainUI as UIHomeComputer).fixture = this
vmRunner = VMRunnerFactory(ModMgr.getGdxFile("dwarventech", "bios").path(), vm, "js")
}
companion object {
val GRAPHICSCONFIG = AdapterConfig(
"crt_color",
560, 448, 80, 32, 253, 255, 256 shl 10, "FontROM7x14.tga", 0.0f, GraphicsAdapter.TEXT_TILING_SHADER_COLOUR
)
}
}
@@ -99,6 +147,7 @@ internal class UIHomeComputer : UICanvas(
private var camera: OrthographicCamera
internal lateinit var vm: VM
internal lateinit var fixture: FixtureHomeComputer
init {
batch = FlippingSpriteBatch()
@@ -138,6 +187,7 @@ internal class UIHomeComputer : UICanvas(
}
override fun doOpening(delta: Float) {
fixture.startVM()
}
override fun doClosing(delta: Float) {

View File

@@ -42,7 +42,7 @@ class ItemWearableWorldRadar(originalID: String) : GameItem(originalID) {
override var baseToolSize: Double? = baseMass
private val vm = VM(73728, TheRealWorld(), arrayOf(
private val vm = VM(ModMgr.getGdxFile("dwarventech", "bios").path(), 73728, TheRealWorld(), arrayOf(
VMProgramRom(ModMgr.getGdxFile("dwarventech", "bios/pipboot.rom").path()),
VMProgramRom(ModMgr.getGdxFile("dwarventech", "bios/pipcode.bas").path())
))

View File

@@ -1,83 +1,21 @@
let len = 560*448;
let pcnt = (system.maxmem() / len)|0;
if (pcnt < 2) {
printerrln("Not enought RAM on the system to test!");
return;
}
let c = 0;
print("Rendering plane ");
for (c = 0; c < pcnt; c++) {
print(`${c} `);
for (let i = 0; i < len; i++) {
sys.poke(c*len + i, c * ((256/pcnt)|0) + 1);
}
}
println("Let's see how fast DMA really is!");
c = 0;
while (1) {
con.reset_graphics();con.curs_set(0);con.clear();
graphics.resetPalette();graphics.setBackground(0,0,0);
let logo = gzip.decomp(base64.atob("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"));
// display logo in mundane, true-to-msx way
graphics.setFramebufferScroll(0,-164);
// hide entire framebuffer with black text to hide the slow image drawing
con.color_pair(0,0);
for(let i=0;i<2560;i++)graphics.putSymbolAt(1+(i/80)|0,1+(i%80),239);
// draw logo
for(let i=0;i<logo.length;i++){graphics.plotPixel(i%560,95+(i/560)|0,logo[i])}
// cover up bottom part with text characters (!)
graphics.setBackground(0,4,15);con.color_pair(14,255);
for(let y=1;y<19;y++)for(let x=1;x<81;x++)graphics.putSymbolAt(y,x,32);
for(let x=1;x<81;x++)graphics.putSymbolAt(19,x,220);
for(let y=20;y<33;y++)for(let x=1;x<81;x++)graphics.putSymbolAt(y,x,219);
// scroll up
let tmr=sys.nanoTime();
let tlen=1073741824;
while(1){let tdiff=sys.nanoTime()-tmr;if(tdiff>=tlen)break;
graphics.setFramebufferScroll(0,-((1.0-tdiff/tlen)*164)|0);}
// show how much ram is there
con.color_pair(239,14);
let vramstr="VIDEO RAM : 256 Kbytes";
let uramstr=` USER RAM : ${system.maxmem()>>>10} Kbytes`;
con.move(20,(80-vramstr.length)/2);println(vramstr);
con.move(21,(80-uramstr.length)/2);println(uramstr);
///////////////////////////////////////////////////////////////////////////////
// probe bootable device
/*var _BIOS = {};
// Syntax: [Port, Drive-number]
// Port #0-3: Serial port 1-4
// #4+ : Left for future extension
// Drive-number always starts at 1
_BIOS.FIRST_BOOTABLE_PORT = [0,1]; // ah screw it
Object.freeze(_BIOS);*/
///////////////////////////////////////////////////////////////////////////////
// make user wait around because why not
tmr = sys.nanoTime();
while (sys.nanoTime() - tmr < 2147483648) sys.spin();
// clear screen
graphics.clearPixels(255);con.color_pair(239,255);
con.clear();con.move(1,1);
///////////////////////////////////////////////////////////////////////////////
// load a bootsector using 'LOADBOOT'
let portNumber = 0;
let driveStatus = 0;
while (portNumber < 4) {
if (com.areYouThere(portNumber)) {
com.sendMessage(portNumber, "LOADBOOT");
driveStatus = com.getStatusCode(portNumber);
if (driveStatus == 0) break;
}
portNumber += 1;
}
if (portNumber < 4) {
// eval(com.fetchResponse(portNumber).trimNull());
// using Function() so that BIOS variables won't get leaked in
{Function("\"use strict\";var _BIOS={};_BIOS.FIRST_BOOTABLE_PORT=[0,1];Object.freeze(_BIOS);"+com.fetchResponse(portNumber).trimNull())()};
break;
}
else {
printerrln("No bootable medium found.");
}
dma.ramToFrame(len * c, 0, len);
c = (c + 1) % pcnt;
}

Binary file not shown.

View File

@@ -6,5 +6,5 @@ entrypoint=net.torvald.terrarum.modulecomputers.EntryPoint
releasedate=2021-12-03
version=0.3.0
jar=ModuleComputers.jar
jarhash=b2d50cc10693885f060a5825a4fb2be2993b461bae2e58b4a4900fa169ec898f
jarhash=384E6650960E9D044055C5BAFE4C941398B688C3809FA6733B06DDB92A746CFA
dependency=basegame 0.3.0

Binary file not shown.

View File

@@ -218,7 +218,7 @@ object ModMgr {
val hash = digester.digest(File(jarFilePath).readBytes()).joinToString("","","") { it.toInt().and(255).toString(16).uppercase().padStart(2,'0') }
if (jarHash != hash) {
println("Hash expected: $jarHash, got: $hash")
printdbg(this, "Hash expected: $jarHash, got: $hash")
throw IllegalStateException("Module Jarfile hash mismatch")
}

View File

@@ -144,7 +144,10 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) {
val SIZE_NORMAL = Point2i(9000, 2250)
val SIZE_LARGE = Point2i(13500, 2970)
val SIZE_HUGE = Point2i(22500, 4500)
val WORLDSIZE = arrayOf(SIZE_SMALL, SIZE_NORMAL, SIZE_LARGE, SIZE_HUGE)
val WORLDSIZE = if (App.IS_DEVELOPMENT_BUILD)
arrayOf(Point2i(2880, 1350), SIZE_SMALL, SIZE_NORMAL, SIZE_LARGE, SIZE_HUGE)
else
arrayOf(SIZE_SMALL, SIZE_NORMAL, SIZE_LARGE, SIZE_HUGE)
val worldgenThreadExecutor = ThreadExecutor()
}

View File

@@ -16,7 +16,7 @@ import net.torvald.terrarum.ui.*
/**
* Created by minjaesong on 2021-11-10.
*/
class UIKeyboardInputConfig(remoCon: UIRemoCon?) : UICanvas() {
class UIIMEConfig(remoCon: UIRemoCon?) : UICanvas() {
override var width = 480
override var height = 600
@@ -179,7 +179,7 @@ class UIKeyboardInputConfig(remoCon: UIRemoCon?) : UICanvas() {
// title
// TODO only when text input using gamepad is supported, and even then, use text spinner
// val title = Lang["MENU_CONTROLS_KEYBOARD"]
// val title = Lang["MENU_LABEL_IME"]
// App.fontGame.draw(batch, title, drawX.toFloat() + (width - App.fontGame.getWidth(title)) / 2, drawY.toFloat())
batch.color = Color.WHITE
@@ -230,7 +230,7 @@ class UIKeyboardInputConfig(remoCon: UIRemoCon?) : UICanvas() {
* @param key LibGDX keycode. Set it to `null` to "disable" the key. Also see [com.badlogic.gdx.Input.Keys]
*/
private class UIItemInputKeycap(
val parent: UIKeyboardInputConfig,
val parent: UIIMEConfig,
initialX: Int,
initialY: Int,
val key: Int?,

View File

@@ -32,7 +32,7 @@ class UIInventoryEscMenu(val full: UIInventoryFull) : UICanvas() {
private val gameMenu = arrayOf(
"MENU_IO_SAVE_GAME",
"MENU_OPTIONS_CONTROLS",
"MENU_CONTROLS_KEYBOARD",
"MENU_LABEL_IME",
"MENU_LABEL_LANGUAGE",
"MENU_LABEL_QUIT",
)
@@ -77,7 +77,7 @@ class UIInventoryEscMenu(val full: UIInventoryFull) : UICanvas() {
private val savingUI = UIItemSaving(this, (width - UIItemSaving.WIDTH) / 2, (height - UIItemSaving.HEIGHT) / 2)
private val keyConfigUI = UIKeyboardControlPanel(null)
private val languageUI = UITitleLanguage(null)
private val keyboardSetupUI = UIKeyboardInputConfig(null)
private val keyboardSetupUI = UIIMEConfig(null)
private var oldScreen = 0
private var screen = 0

View File

@@ -9,7 +9,6 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion
import net.torvald.terrarum.App
import net.torvald.terrarum.CommonResourcePool
import net.torvald.terrarum.DefaultConfig
import net.torvald.terrarum.gamecontroller.TerrarumKeyboardEvent
import net.torvald.terrarum.langpack.Lang
import net.torvald.terrarum.ui.*
@@ -270,7 +269,7 @@ private class UIItemKeycap(
this.posX = initialX + parent.kbx
this.posY = initialY + parent.kby
}
else if (parent is UIKeyboardInputConfig) {
else if (parent is UIIMEConfig) {
this.posX = initialX + parent.kbx
this.posY = initialY + parent.kby
}

View File

@@ -44,7 +44,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() {
private val radioCellWidth = 100
private val inputWidth = 340
private val radioX = (width - (radioCellWidth * 4 + 9)) / 2
private val radioX = (width - (radioCellWidth * (if (App.IS_DEVELOPMENT_BUILD) 5 else 4) + 9)) / 2
private val inputX = width - inputWidth
private val sizeSelY = 186 + 40
@@ -53,12 +53,22 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() {
private val sizeSelector = UIItemInlineRadioButtons(this,
drawX + radioX, drawY + sizeSelY, radioCellWidth,
listOf(
{ Lang["CONTEXT_DESCRIPTION_SMALL"] },
{ Lang["MENU_SETTING_MEDIUM"] }, // ;p
{ Lang["CONTEXT_DESCRIPTION_BIG"] },
{ Lang["CONTEXT_DESCRIPTION_HUGE"] }
))
if (App.IS_DEVELOPMENT_BUILD)
listOf(
{ Lang["CONTEXT_DESCRIPTION_TINY"] },
{ Lang["CONTEXT_DESCRIPTION_SMALL"] },
{ Lang["MENU_SETTING_MEDIUM"] }, // ;p
{ Lang["CONTEXT_DESCRIPTION_BIG"] },
{ Lang["CONTEXT_DESCRIPTION_HUGE"] }
)
else
listOf(
{ Lang["CONTEXT_DESCRIPTION_SMALL"] },
{ Lang["MENU_SETTING_MEDIUM"] }, // ;p
{ Lang["CONTEXT_DESCRIPTION_BIG"] },
{ Lang["CONTEXT_DESCRIPTION_HUGE"] }
)
)
private val rng = HQRNG()
@@ -125,7 +135,7 @@ class UINewWorld(val remoCon: UIRemoCon) : UICanvas() {
// App.fontUITitle.draw(batch, titlestr, drawX + (width - App.fontGame.getWidth(titlestr)).div(2).toFloat(), titleTextPosY.toFloat())
// draw size previews
val texture = tex[sizeSelector.selection]
val texture = tex[sizeSelector.selection.coerceAtMost(tex.lastIndex)]
val tx = drawX + (width - texture.regionWidth) / 2
val ty = drawY + (160 - texture.regionHeight) / 2
batch.draw(texture, tx.toFloat(), ty.toFloat())

View File

@@ -16,7 +16,7 @@ object UITitleRemoConYaml {
- MENU_OPTIONS
- MENU_LABEL_GRAPHICS : net.torvald.terrarum.modulebasegame.ui.UIGraphicsControlPanel
- MENU_OPTIONS_CONTROLS : net.torvald.terrarum.modulebasegame.ui.UIKeyboardControlPanel
- MENU_CONTROLS_KEYBOARD : net.torvald.terrarum.modulebasegame.ui.UIKeyboardInputConfig
- MENU_LABEL_IME : net.torvald.terrarum.modulebasegame.ui.UIIMEConfig
- MENU_LABEL_LANGUAGE : net.torvald.terrarum.modulebasegame.ui.UITitleLanguage
- MENU_MODULES : net.torvald.terrarum.ModOptionsHost
- MENU_LABEL_RETURN+WRITETOCONFIG

View File

@@ -53,6 +53,7 @@ import kotlin.math.roundToInt
* ...
* endClosing()
* ```
* NOTE: show/hide is a UICanvas function, while do/endSomething() is UIHandler function.
*
* Created by minjaesong on 2015-12-31.
*/