diff --git a/src/net/torvald/terrarum/gameworld/WorldTime.kt b/src/net/torvald/terrarum/gameworld/WorldTime.kt index f7411ef2b..2d07dec5f 100644 --- a/src/net/torvald/terrarum/gameworld/WorldTime.kt +++ b/src/net/torvald/terrarum/gameworld/WorldTime.kt @@ -152,21 +152,7 @@ class WorldTime(initTime: Long = 0L) { @Transient private val REAL_SEC_TO_GAME_SECS = 1.0 / GAME_MIN_TO_REAL_SEC // how slow is real-life clock (second-wise) relative to the ingame one // NOTE: ingame calendars (the fixture with GUI) should use symbols AND fullnames; the watch already uses shot daynames - val DAY_NAMES = arrayOf(//daynames are taken from Nynorsk (å -> o) - "MONDAG", "TYSDAG", "MIDTVEKE" //middle-week - , "TORSDAG", "FREDAG", "LAURDAG", "SUNDAG", "VERDDAG" //From Norsk word 'verd' - ) - val DAY_NAMES_SHORT = arrayOf("MON", "TYS", "MID", "TOR", "FRE", "LAU", "SUN", "VER") - // dwarven calendar of 12 monthes - /*val MONTH_NAMES = arrayOf( - "Opal", "Obsidian", "Granite", "Slate", "Felsite", "Hematite", - "Malachite", "Galena", "Limestone", "Sandstone", "Timber", "Moonstone" - ) - val MONTH_NAMES_SHORT = arrayOf("Opal", "Obsi", "Gran", "Slat", "Fels", "Hema", - "Mala", "Gale", "Lime", "Sand", "Timb", "Moon")*/ - val MONTH_NAMES = arrayOf("SPRING", "SUMMER", "AUTUMN", "WINTER") - val MONTH_NAMES_SHORT = arrayOf("SPRI", "SUMM", "AUTM", "WINT") companion object { /** Each day is displayed as 24 hours, but in real-life clock it's 22 mins long */ @@ -204,6 +190,31 @@ class WorldTime(initTime: Long = 0L) { val LUNAR_CYCLE: Int = 29 * DAY_LENGTH + 12 * HOUR_SEC + 44 * MINUTE_SEC + 3 // 29 days, 12 hours, 44 minutes, and 3 seconds in-game calendar const val DIURNAL_MOTION_LENGTH = 86636f + + val DAY_NAMES = arrayOf(//daynames are taken from Nynorsk (å -> o) + "MONDAG", "TYSDAG", "MIDTVEKE" //middle-week + , "TORSDAG", "FREDAG", "LAURDAG", "SUNDAG", "VERDDAG" //From Norsk word 'verd' + ) + val DAY_NAMES_SHORT = arrayOf("MON", "TYS", "MID", "TOR", "FRE", "LAU", "SUN", "VER") + // dwarven calendar of 12 monthes + /*val MONTH_NAMES = arrayOf( + "Opal", "Obsidian", "Granite", "Slate", "Felsite", "Hematite", + "Malachite", "Galena", "Limestone", "Sandstone", "Timber", "Moonstone" + ) + val MONTH_NAMES_SHORT = arrayOf("Opal", "Obsi", "Gran", "Slat", "Fels", "Hema", + "Mala", "Gale", "Lime", "Sand", "Timb", "Moon")*/ + val MONTH_NAMES = arrayOf("SPRING", "SUMMER", "AUTUMN", "WINTER") + val MONTH_NAMES_SHORT = arrayOf("SPRI", "SUMM", "AUTM", "WINT") + + val DAY_NAMES_LANG_KEYS = DAY_NAMES.map { "CONTEXT_CALENDAR_DAY_${it}_DNT" } + val DAY_NAMES_SHORT_LANG_KEYS = DAY_NAMES_SHORT.map { "CONTEXT_CALENDAR_DAY_${it}_DNT" } + val MONTH_NAMES_LANG_KEYS = MONTH_NAMES.map { "CONTEXT_CALENDAR_SEASON_${it}" } + val MONTH_NAMES_SHORT_LANG_KEYS = MONTH_NAMES_SHORT.map { "CONTEXT_CALENDAR_SEASON_${it}" } + + fun getDayName(index: Int) = Lang[DAY_NAMES_LANG_KEYS[index]] + fun getDayNameShort(index: Int) = Lang[DAY_NAMES_SHORT_LANG_KEYS[index]] + fun getMonthName(index: Int) = Lang[MONTH_NAMES_LANG_KEYS[index - 1]] + fun getMonthNameShort(index: Int) = Lang[MONTH_NAMES_SHORT_LANG_KEYS[index - 1]] } fun update(delta: Float) { @@ -229,9 +240,6 @@ class WorldTime(initTime: Long = 0L) { TIME_T += t } - val dayName: String - get() = DAY_NAMES[dayOfWeek] - fun Long.toPositiveInt() = this.and(0x7FFFFFFF).toInt() fun Long.abs() = Math.abs(this) @@ -252,10 +260,10 @@ class WorldTime(initTime: Long = 0L) { fun getShortTime() = "${years.toString().padStart(4, '0')}-${getMonthNameShort()}-${calendarDay.toString().padStart(2, '0')}" fun getFilenameTime() = "${years.toString().padStart(4, '0')}${calendarMonth.toString().padStart(2, '0')}${calendarDay.toString().padStart(2, '0')}" - fun getDayNameFull() = Lang["CONTEXT_CALENDAR_DAY_${DAY_NAMES[dayOfWeek]}_DNT"] - fun getDayNameShort() = Lang["CONTEXT_CALENDAR_DAY_${DAY_NAMES_SHORT[dayOfWeek]}_DNT"] - fun getMonthNameFull() = Lang["CONTEXT_CALENDAR_SEASON_${MONTH_NAMES[calendarMonth - 1]}"] - fun getMonthNameShort() = Lang["CONTEXT_CALENDAR_SEASON_${MONTH_NAMES_SHORT[calendarMonth - 1]}"] + fun getDayNameFull() = getDayName(dayOfWeek) + fun getDayNameShort() = getDayNameShort(dayOfWeek) + fun getMonthNameFull() = getMonthName(calendarMonth) + fun getMonthNameShort() = getMonthNameShort(calendarMonth) override fun toString() = getFormattedTime() } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWallCalendar.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWallCalendar.kt index 174439b24..347fe1946 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWallCalendar.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureWallCalendar.kt @@ -5,6 +5,7 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase +import net.torvald.terrarum.modulebasegame.ui.UIWallCalendar import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack /** @@ -14,7 +15,8 @@ class FixtureWallCalendar : FixtureBase { constructor() : super( BlockBox(BlockBox.NO_COLLISION, 1, 1), - nameFun = { Lang["ITEM_CALENDAR"] } + nameFun = { Lang["ITEM_CALENDAR"] }, + mainUI = UIWallCalendar() ) { val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/calendar.tga") diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWallCalendar.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWallCalendar.kt new file mode 100644 index 000000000..2ffdf355b --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWallCalendar.kt @@ -0,0 +1,121 @@ +package net.torvald.terrarum.modulebasegame.ui + +import com.badlogic.gdx.graphics.Camera +import com.badlogic.gdx.graphics.g2d.SpriteBatch +import net.torvald.terrarum.App +import net.torvald.terrarum.INGAME +import net.torvald.terrarum.RunningEnvironment +import net.torvald.terrarum.gameworld.WorldTime +import net.torvald.terrarum.gameworld.WorldTime.Companion.MONTH_LENGTH +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.ui.Toolkit +import net.torvald.terrarum.ui.UICanvas +import net.torvald.unicode.getKeycapPC + +/** + * Created by minjaesong on 2023-08-15. + */ +class UIWallCalendar : UICanvas( + toggleKeyLiteral = App.getConfigInt("control_key_inventory"), + toggleButtonLiteral = App.getConfigInt("control_gamepad_start"), +) { + private val cellWidth = 96 + private val cellHeight = 24 + + override var width: Int = Toolkit.drawWidth + override var height: Int = App.scr.height + + private val y = UIInventoryFull.INVENTORY_CELLS_OFFSET_Y() + 1 - 34 + + private val drawStartX = (Toolkit.drawWidth - cellWidth * 8) / 2 - 4 + private val cellsStartY = y + 34 + + private val SP = "\u3000 " + val controlHelp: String + get() = if (App.environment == RunningEnvironment.PC) + "${getKeycapPC(App.getConfigInt("control_key_inventory"))} ${Lang["GAME_ACTION_CLOSE"]}" + else + "${App.gamepadLabelStart} ${Lang["GAME_ACTION_CLOSE"]}" + + override fun updateUI(delta: Float) { + + } + + + override fun renderUI(batch: SpriteBatch, camera: Camera) { + UIInventoryFull.drawBackground(batch, 1f) + + val today = INGAME.world.worldTime.ordinalDay + 1 + val todayOfWeek = INGAME.world.worldTime.dayOfWeek + + // cell background + batch.color = UIInventoryFull.CELL_COL + for (week in 0..7) { + Toolkit.fillArea(batch, drawStartX + (cellWidth + 1) * week + 1, y, cellWidth - 2, 24) + } + for (cellNum in 0 until 17 * 8) { + Toolkit.fillArea(batch, drawStartX + (cellWidth + 1) * (cellNum % 8) + 1, cellsStartY + (cellHeight + 3) * (cellNum / 8), cellWidth - 2, cellHeight) + } + + + // cell border + batch.color = Toolkit.Theme.COL_INACTIVE + Toolkit.drawBoxBorder(batch, drawStartX, y - 1, 8 * (cellWidth + 1) - 1, 26) + for (week in 0..7) { + Toolkit.drawBoxBorder(batch, drawStartX + (cellWidth + 1) * week, y - 1, cellWidth, 26) + } + + Toolkit.drawBoxBorder(batch, drawStartX, cellsStartY - 1, 8 * (cellWidth + 1) - 1, 17 * (cellHeight + 3) - 1) + for (cellNum in 0 until 17 * 8) { + Toolkit.drawBoxBorder(batch, drawStartX + (cellWidth + 1) * (cellNum % 8), cellsStartY + (cellHeight + 3) * (cellNum / 8) - 1, cellWidth, cellHeight + 2) + } + + + // cell texts + for (week in 0..7) { + batch.color = if (week == todayOfWeek) Toolkit.Theme.COL_MOUSE_UP else Toolkit.Theme.COL_LIST_DEFAULT + val t = WorldTime.getDayName(week) + val tlen = App.fontGame.getWidth(t) + App.fontGame.draw(batch, t, drawStartX + (cellWidth + 1) * week + (cellWidth - tlen) / 2, y) + } + var dayAkku = 1 + for (cellNum in 0 until 17 * 8) { + val day = if (cellNum == 17*8-1) 120 else if (cellNum % 8 == 7) 0 else dayAkku + + if (day > 0) { + batch.color = if (day == today) Toolkit.Theme.COL_SELECTED else Toolkit.Theme.COL_LIST_DEFAULT + val t = "${(day % MONTH_LENGTH).let { if (it == 0) MONTH_LENGTH else it }}".padStart(2, '\u2007') + App.fontGame.draw(batch, t, drawStartX + (cellWidth + 1) * (cellNum % 8) + 1 + cellWidth - 23, cellsStartY + (cellHeight + 3) * (cellNum / 8)) + dayAkku += 1 + } + } + + } + + override fun doOpening(delta: Float) { + super.doOpening(delta) + INGAME.pause() + INGAME.setTooltipMessage(null) + } + + override fun doClosing(delta: Float) { + super.doClosing(delta) + INGAME.resume() + INGAME.setTooltipMessage(null) + } + + override fun endOpening(delta: Float) { + super.endOpening(delta) + UIItemInventoryItemGrid.tooltipShowing.clear() + INGAME.setTooltipMessage(null) // required! + } + + override fun endClosing(delta: Float) { + super.endClosing(delta) + UIItemInventoryItemGrid.tooltipShowing.clear() + INGAME.setTooltipMessage(null) // required! + } + + override fun dispose() { + } +} \ No newline at end of file