From 76ac236be37dd3d62dea4960f1e8908f262fda86 Mon Sep 17 00:00:00 2001 From: John McCardle Date: Sat, 8 Jul 2023 19:42:47 -0400 Subject: [PATCH] Linux Game Jam 2023 mini-contribution --- assets/Sprite-0001.ase | Bin 0 -> 2145 bytes assets/Sprite-0001.png | Bin 0 -> 3863 bytes run_linux.sh | 1 + src/GameEngine.cpp | 2 +- src/MenuScene.cpp | 8 +- src/MenuScene.h | 1 + src/scripts/TestScene.py | 170 +++++++++++++++++++++++++++++++++------ 7 files changed, 156 insertions(+), 26 deletions(-) create mode 100644 assets/Sprite-0001.ase create mode 100644 assets/Sprite-0001.png diff --git a/assets/Sprite-0001.ase b/assets/Sprite-0001.ase new file mode 100644 index 0000000000000000000000000000000000000000..b7a30e199c698f73317d7092cf84c923de85d71b GIT binary patch literal 2145 zcmcJPdr%Wc9LLYM9qY7?ManoBM(d*@N(jbMLt-5tQ%#^gNW>6O5fHQ>5JZR}W7Voa zWwas*DCtN&$}7x>HWEA-i;9AH#S>CS9`Z6CX^ct|%0WVZCs>tE+rPTG`~3EHce3B_ z?*4Y?R0Mf^X&mA<0e;9h1VMJg`=%^-Q~h6R9a9j5dNJ{@SsgHoi`(m2=Z~Fp7(wQ` zc>~uj;sC>an7|C-N??2J0$}qG;lO9r*}%bSa1$M%D&kY79L)l>gu%7&4LG1$qI%D7XZR;1A4!Gq44oz!10rE8qi6fCG>Z z+Cey|2FbME;bBk;GC?B<1a%+{bb%;P1afFG?-mApPIQ~_RwFHT3c}x+6c*>k{A@CU zOmahz>BwYcc>L>83FFov2hW?Dzli>b`Qfn+A3@WiX-jXOa_zq}{o445$BSDId!(H_ zdg5U^r`41apotsMT8^$t-3A8|oyv9Z@cT8yksj0#ajB|%fa)Wpk>^9ZsTf<9xt}~!P{k-MCFXBY zR8?a9EWRBRDAy^J(FYe^l;4)})gCG;&E`TdU5T#m3##_0p~Cd#jyB4F_NG`YJ8s6a zj*y83Jia26sor8Ghp$JnZ8wVs@c2k2Q==Z^B;WYjU2Ba+|`L$2V;QzSf(cIcYM zey9Zf)V;;1Odjq;VBE4)GFW{>%CCXP(r4fK_woPqPo?>c#8nA_&G`)sbavZ&d_7ey zE#X0^=zPu=d5CO#EXT=j6UP%*9i9^72N1Sq;JV^N>{^Ta4XKAxGl{rb98Lw~c=*;x zhgTjZw=0wy>v1|n8>w1Ue68{_IZIQzPj}4do}IE=>aV$HV@qNsDi!Is2zA%Evsl)A zN5#jcr1^xCK2xQlDte>N8s_oa`/g{XNTx;!y}=s%=wsVF36mEvcTyV6_XBUUk5 zls^*-Gv!wI4o^{XpZLLAG0?sA5~wecG5$9BkS`kgIT}ip(PMFAYme=DQR5@Q6*BmC zgl=XoDsxd6@caoZ9e=3KryG0mmom$yL2qgrtF_k3Pu%q*Dbz&t#=H~o2c3ge=Lh0P zbO=XGU&lE2pP1GfGqlbnytd#g4o?i1)?p%VaN;D;w#e2J9{q4!UTss?$bvHMvFs7O zwCuoaZj^fDV2v*Kt1!s#rvf9QT1%iQ94j* zo{|LLEs7av5$MPJWWQ&W;$2IuGW*yW{F(MUJtn=O>5rlJQFX!vt#f@sTd=o2N!Ab) zGGMyYlU!%WC>89z&yQJ_cZT%amcyN^qRQCvHD1<;uc;Hed+}P!`aJQV*)Hef@o$o% zB8qZp$0xp(7+Cv(1iw5Uf5r8g4P4k5{2ZTlz4$waXX|snHG}D-k}LMII-6MZw$&`$ zqJUw^(}@flCnrE)Hj#nC<(M`M+!Xqf8SvpNGVz>Tc%@k<&%fp}v-=pi)c|q2t8fzg7=~G;!)LhftE8azS zu=2=4Ls5<N@@Stt z$P|tE{!dXq&=P3f${6fso8XXWL$7D4nSGw(aJSX3IHk)1Zir^^{m0 znSz+4y_h155JMMZC)E^`ffeOcF4u>ed(oJB>u(i0QXKDV(?nA_eQldi*+SyN^Ef?A zMfHv0zwarRNZU={yY`;CJ5F#d&uck32arXZS)0HB- literal 0 HcmV?d00001 diff --git a/assets/Sprite-0001.png b/assets/Sprite-0001.png new file mode 100644 index 0000000000000000000000000000000000000000..d5efe1414550a90d2775279ec692d211678925fb GIT binary patch literal 3863 zcmeH{hf@=I6vuxH2q6LqAVon40l^dH55<} z$W=%HfU>dt}-5=Gv-k*E-$FQo!FXy z7g1YQ%(TTO2Y&;(bmvc8I7#km894wlTSnAOBE^EE%y!42rkaZ()W^}N?5>KQ@!=20 zEjDK#vw$N_A}X~lR*_%O5b=q7Dm{zJZ;4eL^=^%YR+>q34LA}3perh(0ic;LW_3(E zNW{i12-=5zAI(qZBzn5uqH^cV=U*R-m)v-NzGLw7yUB0JuhX56mX+k0<$Rm{eVP+5 z8H?bVLLgw{XE`G^{WU2i-bU6Ay3}gBm<&s;k<>gw z`^ztXb!KK9+(MyNuS%bAv@JO7>Fb(3$PQly0x!|wQqxs2|30%4lEEdEJ3yFUaPTEg2{fP{Fu4!%rR9s(>|5=~ZSfgkZ43%EiE|<9@nj zI%<-BA|>T4zS`}a8|m?r0Z>>std6F4iG@O+zP9OjX9jSwf~zZQ79BYx_7w{FqhVQ{ zrl5;N2afMw_X$ep(OB=9;FzmXX27e|h9GNRztI4nt;igAw9{)lrDSE%R5>iEh%cN4 zx#68Vi7|z^`Ua#gEG(8r%KQSK)j?IDUv}4mX%cJhE=QYs;XT+sg|v^HL>TpkxEylO zQ$&h3FU>Xx0MgwnQub4nuX1vtVkHMOW=)^z7n z_VU(MS#%1J9!=$UE_kpVig%V*Cb}O#@(ig7HWft4yz+_3=#ZN0cQvvGxA}n(R?p`t z>FkL{Ls(@&3*o_?1onJ46L0ZejN(|URQcU zsI}-1s)hugQ?`0i1&4T86KM~(d>?ET=Bz!!IA>8!Vo2TN;-z!HHa0!svz2rLm;BJh7EaQ+MGqZ2#9)9BKK OvgetFont()); - text.setString("McRogueFace Engine - 7DRL 2023 Submission (Incomplete)"); + text.setString("McRogueFace Engine - LGJ 2023 (Incomplete)"); text.setCharacterSize(24); //std::cout << "MenuScene Initialized. " << game << std::endl; //std::cout << "Font: " << game->getFont().getInfo().family << std::endl; @@ -13,6 +13,11 @@ MenuScene::MenuScene(GameEngine* g) : Scene(g) text2.setString("Press 'Spacebar' to run demo"); text2.setCharacterSize(16); text2.setPosition(0.0f, 50.0f); + + text3.setFont(game->getFont()); + text3.setString("use 'W' 'A' 'S' 'D' to move (even when blank; it's a bug)"); + text3.setCharacterSize(16); + text3.setPosition(0.0f, 80.0f); registerAction(ActionCode::KEY + sf::Keyboard::Space, "start_game"); registerAction(ActionCode::KEY + sf::Keyboard::Up, "up"); @@ -43,5 +48,6 @@ void MenuScene::sRender() game->getWindow().clear(); game->getWindow().draw(text); game->getWindow().draw(text2); + game->getWindow().draw(text3); game->getWindow().display(); } diff --git a/src/MenuScene.h b/src/MenuScene.h index 70ec13f..cc33279 100644 --- a/src/MenuScene.h +++ b/src/MenuScene.h @@ -8,6 +8,7 @@ class MenuScene: public Scene { sf::Text text; sf::Text text2; + sf::Text text3; public: MenuScene(GameEngine*); diff --git a/src/scripts/TestScene.py b/src/scripts/TestScene.py index fc5c24d..214f137 100644 --- a/src/scripts/TestScene.py +++ b/src/scripts/TestScene.py @@ -26,6 +26,7 @@ class TestEntity: self.facing_direction = 0 self.do_fov = do_fov self.label = label + self.inventory = [] #print(f"Calling C++ with: {repr((self.grid, label, tex_index, self.basesprite, x, y, self))}") grids = mcrfpy.listGrids() for g in grids: @@ -34,7 +35,8 @@ class TestEntity: mcrfpy.createEntity(self.grid, label, tex_index, self.basesprite, x, y, self) def ai_act(self): - if self.label == "player": return + return # no AI motion + #if self.label == "player": return self.move(randint(-1, 1), randint(-1, 1)) scene.actors += 1 @@ -43,15 +45,38 @@ class TestEntity: mcrfpy.unlockPlayerInput() scene.updatehints() - def move(self, dx, dy): + def die(self): + #self.x = -2 + #self.y = -2 + self.move(-1000,-1000) + self.animate(0,animove=(-1000,-1000)) + self.x = -1000 + self.y = -1000 + self.label = "dead" + + def interact(self, initiator, callback): + print(f"Interacted with {self.label}. ", end='') + if self.label == 'item': + print("'taking' item.") + callback() + self.die() + else: + print("blocking movement.") + + def move(self, dx, dy, force=False): # select animation direction # prefer left or right for diagonals. #grids = mcrfpy.listGrids() for g in scene.grids: if g.title == self.grid: - if g.at(self.x + dx, self.y + dy) is None or not g.at(self.x + dx, self.y + dy).walkable: + if not force and g.at(self.x + dx, self.y + dy) is None or not g.at(self.x + dx, self.y + dy).walkable: #print("Blocked at target location.") return + if not force: # entities can be stepped on when force=True (like collecting items!) + for entity in scene.tes: + if (entity.x, entity.y) == (self.x + dx, self.y + dy): + print(f"Blocked by entity {entity.label} at ({entity.x}, {entity.y})") + return entity.interact(self, lambda: self.move(dx, dy, force=True)) if self.label == "player": mcrfpy.lockPlayerInput() scene.updatehints() @@ -70,7 +95,7 @@ class TestEntity: start_sprite = self.basesprite + (self.texture_width * (direction + (4 if attacking else 0))) animation_frames = [start_sprite + i for i in range((self.attack_frames if attacking else self.walk_frames))] mcrfpy.createAnimation( - 0.25, # duration, seconds + 0.15, # duration, seconds self.grid, # parent: a UIMenu or Grid key "entity", # target type: 'menu', 'grid', 'caption', 'button', 'sprite', or 'entity' self.entity_index, # target id: integer index for menu or grid objs; None for grid/menu @@ -119,10 +144,41 @@ class TestEntity: #animations_in_progress -= 1 scene.actors -= 1 #print(f"{self} done animating - {scene.actors} remaining") - if scene.actors == 0: + if scene.actors <= 0: + scene.actors = 0 mcrfpy.unlockPlayerInput() scene.updatehints() +class TestItemEntity(TestEntity): + def __init__(self, grid, label, tex_index, basesprite, x, y, texture_width=64, walk_frames=5, attack_frames=6, do_fov=False, item="Nothing"): + super().__init__(grid, label, tex_index, basesprite, x, y, texture_width, walk_frames, attack_frames, do_fov) + self.item = item + + def interact(self, initiator, callback): + if self.label == 'dead': return super().interact(initiator, callback) + print(f"Interacted with {self.label}, an item. Adding {self.item} to {initiator.label}'s inventory") + initiator.inventory.append(self.item) + callback() + scene.itemguis() + self.die() + +class TestDoorEntity(TestEntity): + def __init__(self, grid, label, tex_index, basesprite, x, y, texture_width=64, walk_frames=5, attack_frames=6, do_fov=False, key="Nothing"): + super().__init__(grid, label, tex_index, basesprite, x, y, texture_width, walk_frames, attack_frames, do_fov) + self.key = key + + def interact(self, initiator, callback): + if self.label == 'dead': return super().interact(initiator, callback) + print(f"Interacted with {self.label}, a Door. ", end='') + if self.key in initiator.inventory: + initiator.inventory.remove(self.key) + print("Taking key & passing.") + callback() + scene.itemguis() + self.die() + else: + print("The door is locked.") + class TestScene: def __init__(self, ui_name = "demobox1", grid_name = "demogrid"): # Texture & Sound Loading @@ -132,9 +188,12 @@ class TestScene: mcrfpy.createTexture("./assets/alives_other.png", 16, 64, 64) #1 - TinyWorld NPCs mcrfpy.createTexture("./assets/alives_other.png", 32, 32, 32) #2 - TinyWorld NPCs - 2x2 sprite mcrfpy.createTexture("./assets/custom_player.png", 16, 5, 13) #3 - player + mcrfpy.createTexture("./assets/Sprite-0001.png", 80, 10, 10) #4 - LGJ2023 keycard + other icons + mcrfpy.createTexture("./assets/tiny_keycards.png", 16, 8, 8) #5 - tiny keycards (ground items) self.ui_name = ui_name self.grid_name = grid_name + # Menu index = 0 #print("Create UI") # Create dialog UI mcrfpy.createMenu(ui_name, 20, 540, 500, 200) @@ -142,18 +201,20 @@ class TestScene: mcrfpy.createCaption(ui_name, "", 24, RED) #mcrfpy.createButton(ui_name, 250, 20, 100, 50, DARKBLUE, (0, 0, 0), "clicky", "testaction") mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKRED, (0, 0, 0), "REPL", "startrepl") - mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKGREEN, (0, 0, 0), "map gen", "gridgen") + ##mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKGREEN, (0, 0, 0), "map gen", "gridgen") #mcrfpy.createButton(ui_name, 250, 20, 100, 50, DARKGREEN, (0, 0, 0), "mapL", "gridgen2") #mcrfpy.createButton(ui_name, 250, 20, 100, 50, DARKBLUE, (192, 0, 0), "a_menu", "animtest") #mcrfpy.createButton(ui_name, 250, 20, 100, 50, DARKRED, GREEN, "a_spr", "animtest2") #mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, GREEN, "Next sp", "nextsp") #mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, RED, "Prev sp", "prevsp") #mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, DARKGREEN, "+16 sp", "skipsp") - mcrfpy.createSprite(ui_name, 0, 0, 20, 20, 5.0) + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKGREEN, (0, 0, 0), "Next", "nextsp") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, (0, 0, 0), "Prev", "prevsp") + mcrfpy.createSprite(ui_name, 4, 1, 10, 10, 2.0) + # Menu index = 1 #print("Create UI 2") entitymenu = "entitytestmenu" - mcrfpy.createMenu(entitymenu, 840, 20, 20, 500) mcrfpy.createButton(entitymenu, 0, 10, 150, 40, DARKBLUE, BLACK, "Up", "test_up") mcrfpy.createButton(entitymenu, 0, 60, 150, 40, DARKBLUE, BLACK, "Down", "test_down") @@ -162,39 +223,69 @@ class TestScene: mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, BLACK, "Attack", "test_attack") mcrfpy.createButton(entitymenu, 0, 210, 150, 40, DARKBLUE, RED, "TE", "testent") + # Menu index = 2 mcrfpy.createMenu( "gridtitlemenu", 0, -10, 0, 0) mcrfpy.createCaption("gridtitlemenu", "", 18, WHITE) #mcrfpy.createCaption("gridtitlemenu", "", 16, WHITE) + # Menu index = 3 mcrfpy.createMenu( "hintsmenu", 0, 505, 0, 0) mcrfpy.createCaption("hintsmenu", "", 16, WHITE) + # Menu index = 4 # menu names must be created in alphabetical order (?!) - thanks, C++ hash map mcrfpy.createMenu( "i", 600, 20, 0, 0) #mcrfpy.createMenu( "camstatemenu", 600, 20, 0, 0) mcrfpy.createCaption("i", "", 16, WHITE) + # Menu index = 5 mcrfpy.createMenu( "j", 600, 500, 0, 0) mcrfpy.createButton( "j", 0, 0, 80, 40, DARKBLUE, WHITE, "Recenter", "activatecamfollow") + # Menu index = 6, 7, 8, 9, 10: keycard sprites + mcrfpy.createMenu("k", 540, 540, 80, 80) #6 + mcrfpy.createSprite("k", 4, 0, 10, 10, 1.0) + + mcrfpy.createMenu("l", 540 + (80 * 1), 540, 80, 80) #7 + mcrfpy.createSprite("l", 4, 1, 10, 10, 1.0) + + mcrfpy.createMenu("m", 540 + (80 * 2), 540, 80, 80) #8 + mcrfpy.createSprite("m", 4, 2, 10, 10, 1.0) + + mcrfpy.createMenu("n", 540 + (80 * 3), 540, 80, 80) #9 + mcrfpy.createSprite("n", 4, 3, 10, 10, 1.0) + + mcrfpy.createMenu("o", 540 + (80 * 4), 540, 80, 80) #10 + mcrfpy.createSprite("o", 4, 4, 10, 10, 1.0) #print("Make UIs visible") self.menus = mcrfpy.listMenus() self.menus[0].visible = True self.menus[1].w = 170 self.menus[1].visible = True #self.menus[2].visible = True - self.menus[2].bgcolor = BLACK - self.menus[3].visible = True - self.menus[3].bgcolor = BLACK - self.menus[4].visible = True - self.menus[4].bgcolor = BLACK - self.menus[5].visible = True - mcrfpy.modMenu(self.menus[0]) - mcrfpy.modMenu(self.menus[1]) - mcrfpy.modMenu(self.menus[2]) - mcrfpy.modMenu(self.menus[3]) - mcrfpy.modMenu(self.menus[4]) - mcrfpy.modMenu(self.menus[5]) + + for mn in range(2, 6): + self.menus[mn].bgcolor = BLACK + self.menus[mn].visible = True + mcrfpy.modMenu(self.menus[mn]) + + for mn in range(6, 11): + self.menus[mn].bgcolor = BLACK + self.menus[mn].visible = False + mcrfpy.modMenu(self.menus[mn]) + + #self.menus[2].bgcolor = BLACK + #self.menus[3].visible = True + #self.menus[3].bgcolor = BLACK + #self.menus[4].visible = True + #self.menus[4].bgcolor = BLACK + #self.menus[5].visible = True + #mcrfpy.modMenu(self.menus[0]) + #mcrfpy.modMenu(self.menus[1]) + #mcrfpy.modMenu(self.menus[2]) + #mcrfpy.modMenu(self.menus[3]) + #mcrfpy.modMenu(self.menus[4]) + #mcrfpy.modMenu(self.menus[5]) #pprint(mcrfpy.listMenus()) #print(f"UI 1 gave back this sprite: {self.menus[0].sprites}") @@ -209,19 +300,42 @@ class TestScene: #mcrfpy.createEntity("demogrid", "tinyenemy", 1, 1538, 3, 6, lambda: None) #print("Create fancy entity") + self.player = TestEntity("demogrid", "player", 3, 20, 17, 3, 5, walk_frames=4, attack_frames=5, do_fov=True) self.tes = [ TestEntity("demogrid", "classtest", 1, 1538, 5, 7, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 1545, 7, 9, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 1552, 9, 11, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 1566, 11, 13, 64, walk_frames=4, attack_frames=6), - TestEntity("demogrid", "classtest", 1, 1573, 13, 15, 64, walk_frames=4, attack_frames=6), + #TestEntity("demogrid", "item", 1, 1573, 13, 15, 64, walk_frames=4, attack_frames=6), TestEntity("demogrid", "classtest", 1, 1583, 15, 17, 64, walk_frames=4, attack_frames=6), TestEntity("demogrid", "classtest", 1, 130, 9, 7, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 136, 11, 9, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 143, 13, 11, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 158, 15, 13, 64, walk_frames=5, attack_frames=6), TestEntity("demogrid", "classtest", 1, 165, 17, 15, 64, walk_frames=5, attack_frames=6), - TestEntity("demogrid", "player", 3, 20, 17, 3, 5, walk_frames=4, attack_frames=5, do_fov=True) + self.player, + + TestItemEntity("demogrid", "GreenKeyCard", 5, 0, 19, 3, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, item="Green Keycard"), + TestItemEntity("demogrid", "BlueKeyCard", 5, 1, 21, 3, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, item="Blue Keycard"), + TestItemEntity("demogrid", "RedKeyCard", 5, 2, 23, 3, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, item="Red Keycard"), + TestItemEntity("demogrid", "OrangeKeyCard", 5, 3, 25, 3, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, item="Orange Keycard"), + TestItemEntity("demogrid", "DevilKeyCard", 5, 4, 27, 3, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, item="Devil Keycard"), + + TestDoorEntity("demogrid", "GreenKeyDoor", 5, 8, 19, 5, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, key="Green Keycard"), + TestDoorEntity("demogrid", "BlueKeyDoor", 5, 9, 21, 5, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, key="Blue Keycard"), + TestDoorEntity("demogrid", "RedKeyDoor", 5, 10, 23, 5, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, key="Red Keycard"), + TestDoorEntity("demogrid", "OrangeKeyDoor", 5, 11, 25, 5, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, key="Orange Keycard"), + TestDoorEntity("demogrid", "DevilKeyDoor", 5, 12, 27, 5, texture_width=64, + walk_frames=5, attack_frames=6, do_fov=False, key="Devil Keycard") ] self.grids = mcrfpy.listGrids() @@ -250,6 +364,13 @@ class TestScene: self.gridgen() self.updatehints() mcrfpy.camFollow(True) + + def itemguis(self): + print(self.player.inventory) + items = ["Green Keycard", "Blue Keycard", "Red Keycard", "Orange Keycard", "Devil Keycard"] + for mn in range(6, 11): + self.menus[mn].visible = items[mn-6] in self.player.inventory + mcrfpy.modMenu(self.menus[mn]) def animate_entity(self, direction, attacking=False): if direction is None: @@ -332,7 +453,7 @@ class TestScene: p.walkable = False p.transparent = False - room_centers = [(randint(0, self.grids[0].grid_x-1), randint(0, self.grids[0].grid_y-1)) for i in range(20)] + [(17, 3)] + room_centers = [(randint(0, self.grids[0].grid_x-1), randint(0, self.grids[0].grid_y-1)) for i in range(20)] + [(17, 3), (20,10) + (20,5)] #room_centers.append((3, 5)) for r in room_centers: # random hallway @@ -420,4 +541,5 @@ def start(): global scene #print("TestScene.start called") scene = TestScene() - + mcrfpy.refreshFov() + scene.updatehints()