started multiple saves.
This commit is contained in:
@@ -1,13 +1,14 @@
|
|||||||
ART
|
ART
|
||||||
+ Update all collisions
|
+ Update all collisions
|
||||||
|
+ Have georgia mcgorgeous talk to you
|
||||||
|
|
||||||
PROGRAMMING
|
PROGRAMMING
|
||||||
+ Save slots?
|
|
||||||
+ try to have dialogue for every wrong interaction
|
+ try to have dialogue for every wrong interaction
|
||||||
+ preload all sounds
|
+ preload all sounds
|
||||||
+ behind house left direction not great
|
+ behind house left direction not great
|
||||||
+ spying broken
|
+ spying broken
|
||||||
+ z-index of bloodclots gem can be in front
|
+ z-index of bloodclots gem can be in front
|
||||||
|
+ still can get into dialogue deadlock somehow
|
||||||
|
|
||||||
IOS
|
IOS
|
||||||
+ all mp3s
|
+ all mp3s
|
||||||
|
|||||||
1
desktop/settings.edn
Normal file
1
desktop/settings.edn
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{:sound-volume 75.0, :music-volume 30.0}
|
||||||
@@ -33,6 +33,6 @@
|
|||||||
(set-screen-wrapper! (fn [screen screen-fn]
|
(set-screen-wrapper! (fn [screen screen-fn]
|
||||||
(try (screen-fn)
|
(try (screen-fn)
|
||||||
(catch Exception e
|
(catch Exception e
|
||||||
(.log Gdx/app (with-out-str (.printStackTrace e)))
|
(.log Gdx/app "ERROR" (with-out-str (.printStackTrace e)))
|
||||||
(.printStackTrace e)
|
(.printStackTrace e)
|
||||||
(set-screen! advent title/title-screen)))))
|
(set-screen! advent title/title-screen)))))
|
||||||
|
|||||||
11
desktop/src-common/advent/saves.clj
Normal file
11
desktop/src-common/advent/saves.clj
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
(ns advent.saves)
|
||||||
|
|
||||||
|
(def saves
|
||||||
|
{:autosave "Autosave"
|
||||||
|
:beginning "Our tale's beginning"
|
||||||
|
:after-dream "The dream is over"
|
||||||
|
:after-cat "The Cat Whisperer"
|
||||||
|
:after-strength "Pro (arm) Wrestler"
|
||||||
|
:after-wisdom "The Wise Guy"
|
||||||
|
:after-jail "Prisoner On The Loose"
|
||||||
|
:in-jail "In The Slammer"})
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
(ns advent.screens.rooms.cat-tree
|
(ns advent.screens.rooms.cat-tree
|
||||||
(:require [advent.screens.rooms :as rooms]
|
(:require [advent.screens.rooms :as rooms]
|
||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.screens.rooms.common :as common]
|
[advent.screens.rooms.common :as common]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
@@ -338,7 +339,7 @@
|
|||||||
(actions/give entities :kiss)
|
(actions/give entities :kiss)
|
||||||
(actions/do-dialogue entities :ego "A kiss for an inventory item?"
|
(actions/do-dialogue entities :ego "A kiss for an inventory item?"
|
||||||
:ego "Sounds like the game designer was running out of good ideas.")
|
:ego "Sounds like the game designer was running out of good ideas.")
|
||||||
(utils/snapshot-state @entities "The Cat Whisperer"))
|
(utils/snapshot-state @entities :after-cat))
|
||||||
(actions/talk entities :ego "I guess I'm too far away.")))
|
(actions/talk entities :ego "I guess I'm too far away.")))
|
||||||
:default (actions/get-script entities (actions/talk entities :ego "Kitty seems disinterested in it."))})
|
:default (actions/get-script entities (actions/talk entities :ego "Kitty seems disinterested in it."))})
|
||||||
cat-stand)
|
cat-stand)
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.tween :as tween]
|
[advent.tween :as tween]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
|
[advent.saves :as saves]
|
||||||
[clojure.zip :as zip]
|
[clojure.zip :as zip]
|
||||||
[clojure.set :as set]
|
[clojure.set :as set]
|
||||||
[clojure.string :as str]
|
[clojure.string :as str]
|
||||||
@@ -240,7 +241,7 @@
|
|||||||
:fairy-godfather "Choose the broom or shovel, and cast it into the pit of fate."
|
:fairy-godfather "Choose the broom or shovel, and cast it into the pit of fate."
|
||||||
:ego "But..."
|
:ego "But..."
|
||||||
:fairy-godfather "No buts.")
|
:fairy-godfather "No buts.")
|
||||||
(utils/snapshot-state @entities "Our tale's beginning")
|
(utils/snapshot-state @entities :beginning)
|
||||||
(actions/update-state entities #(assoc % :seen-intro? true)))
|
(actions/update-state entities #(assoc % :seen-intro? true)))
|
||||||
|
|
||||||
(defn swing [entities]
|
(defn swing [entities]
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
(ns advent.screens.rooms.inside-cafeteria
|
(ns advent.screens.rooms.inside-cafeteria
|
||||||
(:require [advent.screens.rooms :as rooms]
|
(:require [advent.saves :as saves]
|
||||||
|
[advent.screens.rooms :as rooms]
|
||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
@@ -81,7 +82,7 @@
|
|||||||
:warriors "Take thy servant's medal of strength.")
|
:warriors "Take thy servant's medal of strength.")
|
||||||
(actions/give entities :medal)
|
(actions/give entities :medal)
|
||||||
(actions/glad entities)
|
(actions/glad entities)
|
||||||
(utils/snapshot-state @entities "Pro (arm) Wrestler"))
|
(utils/snapshot-state @entities :after-strength))
|
||||||
(do
|
(do
|
||||||
(play-battle entities :lose)
|
(play-battle entities :lose)
|
||||||
(actions/do-dialogue entities
|
(actions/do-dialogue entities
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
(ns advent.screens.rooms.inside-castle
|
(ns advent.screens.rooms.inside-castle
|
||||||
(:require [advent.screens.rooms :as rooms]
|
(:require [advent.screens.rooms :as rooms]
|
||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.screens.rooms.common :as common]
|
[advent.screens.rooms.common :as common]
|
||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
@@ -576,7 +577,7 @@
|
|||||||
(actions/remove-entity entities :trophy)
|
(actions/remove-entity entities :trophy)
|
||||||
(actions/glad entities)
|
(actions/glad entities)
|
||||||
(actions/talk entities :ego "Thanks!")
|
(actions/talk entities :ego "Thanks!")
|
||||||
(utils/snapshot-state @entities "The Wise Guy"))
|
(utils/snapshot-state @entities :after-wisdom))
|
||||||
(actions/do-dialogue entities :ego "What about this?" :game-player "No, that's not the solution. Keep looking."))
|
(actions/do-dialogue entities :ego "What about this?" :game-player "No, that's not the solution. Keep looking."))
|
||||||
(brian-get-to-work entities))
|
(brian-get-to-work entities))
|
||||||
:trophy (actions/get-script entities
|
:trophy (actions/get-script entities
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
(:require [clojure.core.async :refer [chan]]
|
(:require [clojure.core.async :refer [chan]]
|
||||||
[advent.screens.rooms :as rooms]
|
[advent.screens.rooms :as rooms]
|
||||||
[advent.screens.rooms.common :as common]
|
[advent.screens.rooms.common :as common]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
@@ -196,7 +197,7 @@
|
|||||||
:ego "But what now?"
|
:ego "But what now?"
|
||||||
:ego "I have till sunrise before Bloodclot comes and destroys the town."
|
:ego "I have till sunrise before Bloodclot comes and destroys the town."
|
||||||
:ego "Maybe Gandarf can help me!")
|
:ego "Maybe Gandarf can help me!")
|
||||||
(utils/snapshot-state @entities "Prisoner On The Loose"))
|
(utils/snapshot-state @entities :after-jail))
|
||||||
(do
|
(do
|
||||||
(actions/do-dialogue entities :ego "Yes I made it!"
|
(actions/do-dialogue entities :ego "Yes I made it!"
|
||||||
:guard "Hmm?"
|
:guard "Hmm?"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
(:require [advent.screens.rooms :as rooms]
|
(:require [advent.screens.rooms :as rooms]
|
||||||
[advent.screens.rooms.common :as common]
|
[advent.screens.rooms.common :as common]
|
||||||
[advent.screens.rooms.held :as held]
|
[advent.screens.rooms.held :as held]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
[advent.screens.items :as items]
|
[advent.screens.items :as items]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
@@ -270,7 +271,7 @@
|
|||||||
(bloodclot-disappear entities)
|
(bloodclot-disappear entities)
|
||||||
(common/go-to-jail entities 5.0)
|
(common/go-to-jail entities 5.0)
|
||||||
(actions/do-dialogue entities :ego "Hey!" :ego "What's going on? I was just about to teach Bloodclot a lesson!")
|
(actions/do-dialogue entities :ego "Hey!" :ego "What's going on? I was just about to teach Bloodclot a lesson!")
|
||||||
(utils/snapshot-state @entities "In The Slammer"))))
|
(utils/snapshot-state @entities :in-jail))))
|
||||||
:magic-slingshot (actions/get-script entities
|
:magic-slingshot (actions/get-script entities
|
||||||
(actions/do-dialogue entities
|
(actions/do-dialogue entities
|
||||||
:ego "Hey Bloodclot!"
|
:ego "Hey Bloodclot!"
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
[advent.actions :as actions]
|
[advent.actions :as actions]
|
||||||
[advent.zone :as zone]
|
[advent.zone :as zone]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.tween :as tween]
|
[advent.tween :as tween]
|
||||||
[advent.screens.rooms :as rooms]
|
[advent.screens.rooms :as rooms]
|
||||||
[advent.screens.fade :refer [fade-screen]]
|
[advent.screens.fade :refer [fade-screen]]
|
||||||
@@ -768,9 +769,9 @@ void main()
|
|||||||
((get-in entities [:state :time]) layers)
|
((get-in entities [:state :time]) layers)
|
||||||
layers)))
|
layers)))
|
||||||
|
|
||||||
(defn get-state []
|
(defn get-state [selected-save]
|
||||||
(if (utils/has-save?)
|
(if selected-save
|
||||||
(utils/load)
|
(utils/load-snapshot selected-save)
|
||||||
{:object nil
|
{:object nil
|
||||||
:active? true
|
:active? true
|
||||||
:last-room :dream
|
:last-room :dream
|
||||||
@@ -934,7 +935,7 @@ void main()
|
|||||||
:night (utils/make-music "music/night.ogg")
|
:night (utils/make-music "music/night.ogg")
|
||||||
:dream (utils/make-music "dream/music.ogg")
|
:dream (utils/make-music "dream/music.ogg")
|
||||||
:secret-hideout (utils/make-music "music/secret-hideout.ogg")}
|
:secret-hideout (utils/make-music "music/secret-hideout.ogg")}
|
||||||
:state (get-state)
|
:state (get-state @utils/selected-save)
|
||||||
:time-profiles {:object nil
|
:time-profiles {:object nil
|
||||||
:default utils/default-night-merge
|
:default utils/default-night-merge
|
||||||
:sprite utils/default-night-merge-sprite
|
:sprite utils/default-night-merge-sprite
|
||||||
@@ -973,7 +974,7 @@ void main()
|
|||||||
:all-items (assoc items/items :object nil)
|
:all-items (assoc items/items :object nil)
|
||||||
:started? {:value false
|
:started? {:value false
|
||||||
:object nil}
|
:object nil}
|
||||||
:room (as-> (get rooms (:last-room (get-state))) room
|
:room (as-> (get rooms (:last-room (get-state @utils/selected-save))) room
|
||||||
(assoc-in room [:entities :ego] (get-ego screen (:start-pos room) ((:scale-fn room) (:start-pos room)))))}]
|
(assoc-in room [:entities :ego] (get-ego screen (:start-pos room) ((:scale-fn room) (:start-pos room)))))}]
|
||||||
|
|
||||||
(doseq [[k [start time fn]] (get-in entities [:room :timers])]
|
(doseq [[k [start time fn]] (get-in entities [:room :timers])]
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
[play-clj.utils :refer :all]
|
[play-clj.utils :refer :all]
|
||||||
[play-clj.g2d :refer :all]
|
[play-clj.g2d :refer :all]
|
||||||
[advent.utils :as utils]
|
[advent.utils :as utils]
|
||||||
|
[advent.saves :as saves]
|
||||||
[advent.tween :as tween]
|
[advent.tween :as tween]
|
||||||
[advent.screens.scene :as scene]
|
[advent.screens.scene :as scene]
|
||||||
[advent.screens.dialogue :as dialogue]
|
[advent.screens.dialogue :as dialogue]
|
||||||
@@ -89,7 +90,7 @@
|
|||||||
flipped))
|
flipped))
|
||||||
|
|
||||||
(defn quest-label []
|
(defn quest-label []
|
||||||
(if (:seen-intro? (scene/get-state))
|
(if (:seen-intro? (utils/load-snapshot :autosave))
|
||||||
"Continue quest"
|
"Continue quest"
|
||||||
"Begin quest"))
|
"Begin quest"))
|
||||||
|
|
||||||
@@ -100,6 +101,7 @@
|
|||||||
(tween/tween :fade-out screen [:fade :opacity] 0.0 1.0 1.0
|
(tween/tween :fade-out screen [:fade :opacity] 0.0 1.0 1.0
|
||||||
:finish (fn [entities]
|
:finish (fn [entities]
|
||||||
(utils/stop-sound (:music entities))
|
(utils/stop-sound (:music entities))
|
||||||
|
(reset! utils/selected-save save)
|
||||||
(set-screen! @(resolve 'advent.core/advent) scene/scene scene/demo scene/hud dialogue/talking-screen dialogue/choice-screen inventory/inventory-screen safe/safe-screen fade/fade-screen
|
(set-screen! @(resolve 'advent.core/advent) scene/scene scene/demo scene/hud dialogue/talking-screen dialogue/choice-screen inventory/inventory-screen safe/safe-screen fade/fade-screen
|
||||||
)
|
)
|
||||||
entities)
|
entities)
|
||||||
@@ -160,17 +162,24 @@
|
|||||||
(stack-y 280 6)
|
(stack-y 280 6)
|
||||||
(assoc :z 8 :interactable true))})
|
(assoc :z 8 :interactable true))})
|
||||||
|
|
||||||
|
(defn get-selected-save [entities [x y]]
|
||||||
|
(first (filter
|
||||||
|
(every-pred :save #(utils/intersects? % [x y]))
|
||||||
|
(vals entities))))
|
||||||
|
|
||||||
(defn saves-menu []
|
(defn saves-menu []
|
||||||
{"Where we left off" (-> (make-label "Where we left off")
|
(doto
|
||||||
(stack-y 280 0)
|
(into {}
|
||||||
(assoc :z 8
|
(for [[save index] (map #(vector %1 %2)
|
||||||
:interactable true
|
(filter utils/has-save? (keys saves/saves))
|
||||||
:save "Where we left off"))
|
(range))
|
||||||
"Our tale's beginning" (-> (make-label "Our tale's beginning")
|
:let [name (saves/saves save)]]
|
||||||
(stack-y 280 1)
|
[name (-> (make-label name)
|
||||||
(assoc :z 8
|
(stack-y 280 index)
|
||||||
:interactable true
|
(assoc :z 8
|
||||||
:save "Our tale's beginning"))})
|
:interactable true
|
||||||
|
:save save))]))
|
||||||
|
println))
|
||||||
|
|
||||||
(defscreen title-screen
|
(defscreen title-screen
|
||||||
:on-show
|
:on-show
|
||||||
@@ -281,9 +290,9 @@
|
|||||||
entities)
|
entities)
|
||||||
|
|
||||||
:on-touch-up (fn [screen [entities]]
|
:on-touch-up (fn [screen [entities]]
|
||||||
(println "HERE")
|
|
||||||
(when-not (get-in entities [:tweens :fade-out])
|
(when-not (get-in entities [:tweens :fade-out])
|
||||||
(let [[x y] (utils/unproject screen)]
|
(let [[x y] (utils/unproject screen)
|
||||||
|
selected-save (get-selected-save entities [x y])]
|
||||||
(cond
|
(cond
|
||||||
(utils/intersects? (:start-playing entities) [x y])
|
(utils/intersects? (:start-playing entities) [x y])
|
||||||
(-> (apply dissoc entities (keys (:main-menu entities)))
|
(-> (apply dissoc entities (keys (:main-menu entities)))
|
||||||
@@ -295,11 +304,8 @@
|
|||||||
(utils/intersects? (:fullscreen entities) [x y])
|
(utils/intersects? (:fullscreen entities) [x y])
|
||||||
(utils/toggle-fullscreen!)
|
(utils/toggle-fullscreen!)
|
||||||
|
|
||||||
(utils/intersects? (entities "Where we left off") [x y])
|
selected-save
|
||||||
(start-playing screen entities "Where we left off")
|
(start-playing screen entities (:save selected-save))
|
||||||
|
|
||||||
(utils/intersects? (entities "Our tale's beginning") [x y])
|
|
||||||
(start-playing screen entities "Our tale's beginning")
|
|
||||||
|
|
||||||
:else
|
:else
|
||||||
nil))))
|
nil))))
|
||||||
|
|||||||
@@ -8,7 +8,8 @@
|
|||||||
[play-clj.entities :refer [->TextureEntity]]
|
[play-clj.entities :refer [->TextureEntity]]
|
||||||
[clojure.java.io :as io]
|
[clojure.java.io :as io]
|
||||||
[clojure.edn :as edn]
|
[clojure.edn :as edn]
|
||||||
[clojure.string :as str])
|
[clojure.string :as str]
|
||||||
|
[advent.saves :as saves])
|
||||||
(:import [com.badlogic.gdx.graphics Pixmap Pixmap$Blending Pixmap$Filter Texture Texture$TextureFilter]
|
(:import [com.badlogic.gdx.graphics Pixmap Pixmap$Blending Pixmap$Filter Texture Texture$TextureFilter]
|
||||||
[com.badlogic.gdx.graphics.g2d TextureRegion Animation]
|
[com.badlogic.gdx.graphics.g2d TextureRegion Animation]
|
||||||
[com.badlogic.gdx.utils.viewport FitViewport]
|
[com.badlogic.gdx.utils.viewport FitViewport]
|
||||||
@@ -27,6 +28,8 @@
|
|||||||
(def settings (atom {:music-volume 50.0
|
(def settings (atom {:music-volume 50.0
|
||||||
:sound-volume 75.0}))
|
:sound-volume 75.0}))
|
||||||
|
|
||||||
|
(def selected-save (atom nil))
|
||||||
|
|
||||||
(defn current-music-volume [& [factor]]
|
(defn current-music-volume [& [factor]]
|
||||||
(* (Math/pow (/ (:music-volume @settings) 100.0) 2)
|
(* (Math/pow (/ (:music-volume @settings) 100.0) 2)
|
||||||
0.25
|
0.25
|
||||||
@@ -57,28 +60,31 @@
|
|||||||
|
|
||||||
(defn snapshot-state [entities name]
|
(defn snapshot-state [entities name]
|
||||||
(doto (.getPreferences (Gdx/app) "ticks-tales-saves")
|
(doto (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
(.putString name (pr-str (entities :state)))
|
(.putString (saves/saves name) (pr-str (entities :state)))
|
||||||
.flush))
|
.flush))
|
||||||
|
|
||||||
(defn save [entities]
|
(defn save [entities]
|
||||||
(snapshot-state entities "Autosave"))
|
(snapshot-state entities :autosave))
|
||||||
|
|
||||||
|
(defn has-save?
|
||||||
|
([] (has-save? :autosave))
|
||||||
|
([key]
|
||||||
|
(let [name (saves/saves key)]
|
||||||
|
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
|
(.contains name)))))
|
||||||
|
|
||||||
|
(defn load-snapshot [key]
|
||||||
(defn has-save? []
|
(doto (let [name (saves/saves key)]
|
||||||
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
(.contains "Autosave")))
|
(.getString name)
|
||||||
|
edn/read-string
|
||||||
(defn load-snapshot [name]
|
(assoc :active? true)))
|
||||||
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
println))
|
||||||
(.getString name)
|
|
||||||
edn/read-string
|
|
||||||
(assoc :active? true)))
|
|
||||||
|
|
||||||
(defn load []
|
(defn load []
|
||||||
(load-snapshot "Autosave"))
|
(load-snapshot :autosave))
|
||||||
|
|
||||||
(defn save-settings [entities]
|
(defn save-settings! [entities]
|
||||||
(doto (.getPreferences (Gdx/app) "ticks-tales-saves")
|
(doto (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
(.putString "settings" (pr-str @settings))
|
(.putString "settings" (pr-str @settings))
|
||||||
.flush))
|
.flush))
|
||||||
@@ -87,20 +93,12 @@
|
|||||||
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
(.contains "settings")))
|
(.contains "settings")))
|
||||||
|
|
||||||
(defn load-settings []
|
(defn load-settings! []
|
||||||
(reset! settings
|
#_(reset! settings
|
||||||
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
(-> (.getPreferences (Gdx/app) "ticks-tales-saves")
|
||||||
(.getString "settings")
|
(.getString "settings")
|
||||||
edn/read-string)))
|
edn/read-string)))
|
||||||
|
|
||||||
|
|
||||||
(defn load-settings! []
|
|
||||||
(when (.exists (io/file "settings.edn"))
|
|
||||||
(reset! settings (edn/read-string (slurp "settings.edn")))))
|
|
||||||
|
|
||||||
(defn save-settings! []
|
|
||||||
(spit "settings.edn" @settings))
|
|
||||||
|
|
||||||
(defn get-font [filename]
|
(defn get-font [filename]
|
||||||
(let [font (bitmap-font filename)
|
(let [font (bitmap-font filename)
|
||||||
tr (bitmap-font! font :get-region)
|
tr (bitmap-font! font :get-region)
|
||||||
|
|||||||
Reference in New Issue
Block a user