I was tinkering with string manipulation and came across a bit of a 'poser' in regards to the mid() command.
Here is a short example....
Code:
' Open a window and enable double buffering.
set window "Test", 800, 632, false
set redraw off
visible a = "ABCDEF"
visible b
visible c
' display the letters "B" to "E" inclusive...
b = mid(a, 1, 4)
pln b
' This works fine...
' But, when I try to make the third letter "D"
' an "X"...
' mid(b, 3, 1) = "X"
' pln b
' I get a syntax error on line 17 during compile
'(remove the "remarks" from lines 17 and 18
' to see what I mean...)
system "pause"
Defining a string then assigning a variable to a "portion" of the string, using mid(), works fine...
But, trying to replace a character, using mid() causes the compilation to fail with a syntax error.
There is no rush on this one... Whenever you are able... Present situation understood... We will "keep an eye on the store" during your break...
I just want to say that I'll be "gone" for a while, in case you wonder why I don't post or reply. Lots of personal things going on, so I don't have any time left for n7. Probably it will get better in a week or two.
THE STARGATE
Don't sleep, your nightmare is coming ...
click each image to zoom in
Tips
- Each kind of weapons has certain number of power / bullet
- Switch your weapon when it has no power / bullet anymore
- Use gun or crossbow to shoot
- Use trident or bare hands for close combat
Control keys :
- W,A,S,D movement
- Mouse rotation
- ESC quit
- 1,2,3,4,5 select weapon
- left click to shoot
Code:
'========================================================================================
' THE STARGATE
' Don't sleep, your nightmare is coming ...
'
' Tips
' - Each kind of weapons has certain number of power / bullet
' - Switch your weapon when it has no power / bullet anymore
' - Use gun or crossbow to shoot
' - Use trident or bare hands for close combat
'
' Control keys :
' - W,A,S,D movement
' - Mouse rotation
' - ESC quit
' - 1,2,3,4,5 select weapon
' - left click to shoot
'
' Acknowledgement :
' - Marcus, enginea library, https://naalaa.com/forum/thread-124-post-929.html
' - Game assets
' *Building Pixel by LandEnd Studios https://isaquerr.itch.io/building-pixel
' *Free 3D Fps-Shooter Models | TurboSquid https://images.app.goo.gl/NQtoZhALCWDoYFPp6
' *Stealth Battle background music by Mark, meak363 from Pixabay.com
' *Different kinds of weapons such as trident, hands, crossbow of The Spriting Dark
' Carnival https://www.altarofstone.com/forums/viewtopic.php?t=42
' *Man Silhouette https://pixabay.com/vectors/man-silhouette-male-people-4329249/
' *Monster https://images.app.goo.gl/6HiZncjYoCaJ7zSr9
'========================================================================================
'----------------
' INITIALIZATION
'----------------
#win32
include "myassets/enginea.n7"
include "myassets/disclaimer.n7"
set window "stargate",1000,500,false
set redraw off
'constant
constant ENEMY_ID = 6
'color definition
visible white = [255,255,255]
visible black = [0,0,0]
visible green = [0,255,0,150]
visible darkgreen = [0,50,0]
visible red = [255,0,0]
visible gray = [0,0,0,150]
flags = EA_LoadMap("myassets/map.json")
visible player = unset
foreach f in flags
select f.flag
case "player"
player = CreatePlayer(f.x, f.floorY, f.z)
EA_AddObject(player)
EA_SetCamera(player)
case "monster"
o = CreateEnemy(f.x, f.ceilingY, f.z)
EA_AddObject(o)
endsel
next
Disclaimer()
'-------------------------
' MAIN (update,draw,run)
'-------------------------
EA_SetUpdateAction(Update)
EA_SetDrawAction(Draw)
EA_Run()
'------------------------
'-----------
' FUNCTIONS
'-----------
function Update(dt)
if keydown(KEY_ESCAPE,true) then
EA_SetDrawAction(Message(abort))
EA_Stop()
endif
if keydown(KEY_M) then stop music music_
endfunc
function Draw()
set color white
if keydown(KEY_1) then w=1 'gun shooter
if keydown(KEY_2) then w=2 'crossbow
if keydown(KEY_3) then w=3 'trident close combat
if keydown(KEY_4) then w=4 'bare hands close combat
draw image weapon[w],
(width(primary)-width(weapon[w]))/2 - 23 + cos(player.bobAngle*0.5)*player.bobEffect*8,
height(primary)-height(weapon[w])+15 + sin(player.bobAngle)*player.bobEffect*6,
0
' info box
set color gray
draw rect 20,20,200,200,1
set color white
set caret 40,40
wln "INFO BOX"
wln "-------------------"
wln "Weapon Power"
wln "1.Gun : " + info.gun
wln "2.Crossbow : " + info.crossbow
wln "3.Trident : " + info.trident
wln "4.Bare hands : " + info.barehands
wln
wln "Lifes : " + info.lifes
wln "-------------------"
' Crosshair.
if w=1 then
set color darkgreen
cx = width(primary)/2+ cos(player.bobAngle*0.5)*player.bobEffect*8
cy = height(primary)/2+10+ sin(player.bobAngle)*player.bobEffect*6
draw ellipse cx,cy, 20, 20, false
draw line cx-40, cy, cx+40, cy
draw line cx,cy-40, cx, cy+40
endif
'Player's angle and coordinates
angle = round(deg(player.Yaw())%360)'0=south, 90=west, 180= north, 270=east
x = round(player.X())
y = abs(round(player.Y()))
z = round(player.Z())
set font font20
'Compass
set color white
set caret 50,320; wln "Compass"
set color green
draw ellipse 80,410,70,70,1
set color darkgreen
draw ellipse 80,410,70,70
draw ellipse 80,410,60,60
draw ellipse 80,410,20,20
set color white
draw ellipse 80,410,10,10,1
needle = [
80-10*cos(rad(angle+180)),410-10*sin(rad(angle+180)),
80+70*cos(rad(angle+90)),410+70*sin(rad(angle+90)),
80+10*cos(rad(angle-180)),410+10*sin(rad(angle-180))
]
draw poly needle,1
draw line 80,410,80+70*cos(rad(angle+90)),410+70*sin(rad(angle+90))
'Map
size = 30
w_map = 7
h_map = 5
x_rect = width(primary)-w_map*size-40
z_rect = 340
set color green 'frame
draw rect x_rect,z_rect,(w_map+1)*size,h_map*size,1
set color darkgreen 'grid
for i = 0 to w_map+1 draw line x_rect+i*size,z_rect,x_rect+i*size,z_rect+h_map*size 'vertical
for i = 0 to h_map draw line x_rect,z_rect+i*size,x_rect+(w_map+1)*size,z_rect+i*size 'horiontal
'Player's position on the map
posx = x_rect+(w_map-x+2)*size
posz = z_rect+(z-2)*size
set color white
draw rect posx,posz,size,size,1
'Map title
set color white
set caret x_rect,z_rect-20; wln "Map "+x+","+y+","+z
set font 0 'default
endfunc
function CreatePlayer(x, y, z)
player = EA_FpsPlayer()
player.SetPos(x, y, z)
player.SetMouseSens(0.3)
.cel = (.cel + dt*4)%4 'animation
.SetCel(int(.cel)) 'animation
if .state = 0 'Falling from the sky (... ceiling).
res = .Move(0, .dy*dt, 0, 0) 'only move vertically
if res.g 'ground collision
.state = 1 'change state to 1
.dy = 1 'set gravity to 1
.SetSprite(enemy2, 0, true)
endif
else
res = .Move(.DX()*0.75*dt, .dy, .DZ()*0.75*dt, 0)
if res.w 'wall
.SetYaw(rad(deg(atan2(res.dx, res.dz)) - 90 + rnd()*180))
endif
.push = max(.push - 1.5*dt, 0)
endif
'collision enemy and player (close combat)
if .CollidesWith(player) and (w=3 or w=4) then
'close combat trident or barehands
if info.trident > 0 and w=3 then
EA_RemoveObject(this)
info.trident = info.trident - 1
endif
if info.barehands > 0 and w=4 then
EA_RemoveObject(this)
info.barehands = info.barehands - 1
endif
endif
'collision enemy and player (not close combat)
if .CollidesWith(player) and (w=1 or w=2) then 'not a close combat, only gun or crossbow
info.lifes = info.lifes - 1
if info.lifes<=0 then Message(failed)
set color red
draw rect 0,0,width(primary),height(primary),1
redraw
fwait 60
endif
function CreateEnemyBullet(img, x, y, z, dx, dy, dz)
b = EA_Object()
b.SetPos(x, y, z)
b.SetSprite(img, 0, false)
b.SetHeight(height(img)/64)
b.SetRadius(0.5*width(img)/64)
b.dx = dx
b.dy = dy
b.dz = dz
b.numCels = cels(img)
b.cel = 0
b.Update = function(dt)
if .numCels > 1
.cel = (.cel + dt*30)%.numCels
.SetCel(int(.cel))
endif
res = .Move(.dx*dt, .dy*dt, .dz*dt, 0)
if res.any
EA_RemoveObject(this)
else
'collision detection enemy bullet and player
if .CollidesWith(player)
info.lifes = info.lifes - 1
if info.lifes<=0 then Message(failed)
set color red
draw rect 0,0,width(primary),height(primary),1
redraw
fwait 60
endif
endif
endfunc
return b
endfunc
function Message(img)
set color white
draw image img,(width(primary)-width(img))/2,(height(primary)-height(img))/2
set font font40
set caret width(primary)/2,height(primary)-50
center "Press ESC to continue"
redraw
do; wait 1 ;until keydown(KEY_ESCAPE,true)
set font 0 'default
Closing_Credits()
end
endfunc
Many years ago, and I may have mentioned this before, I attempted to use Blender to add objects to Cube2 (sauerbratten) primarily to see if I could and to determine how much work was involved. I had no idea about making models - and still don't - so I used a 'tutorial' to make a 3D wooden crate and a 3D vase.
Initially, the overall "look" of Blender was, for want of a better word, intimidating... Thankfully I had the tutorials to work through. I think it took about half an hour to create each model. Repetition would obviously improve efficiency, but both objects were created successfully... mind you, the final 'size' of the models, looked a little out of place... I think they were too big...
Back then I wasn't interested in 'animations'... ha... I had enough trouble getting my head around static objects... lol
I went online to check 3D modelling software... Yikes... Most either had some huge purchase costs or subscription based plans. There were one or two "free" packages but were quite limited in what they could do...
Found, downloaded and installed the latest version of Blender... Started it up... Almost fell off the chair... I thought the really old version of Blender was intimidating!! I am not sure I have enough years left in me to learn everything... For free and open source software it sure has pretty much all the "bells and whistles"... Really impressive... but scary!
In the first level there are those mechanical birds that move from left to right but at any moment they launch themselves towards the player and then return to their initial position. How can you make them return to their initial position with that motion?
Ha........I read an introduction post about a game jam in another forum. Maybe some members of our user community will be interested in creating a creative game for the jam. https://forum.thegamecreators.com/thread/229610
If one were to say, create a side scrolling Mario-type game that has a level much wider than the desktop, would there be such an example or tutorial on how to use the tilemap library to control the camera and scrolling? Just in case one were to consider such a project...
All I have is the Tilemap Editor PDF file as reference... No rush...
ENCHANTED FOREST
Explore the enchanted forest with your own character, Barbarian or Knight.
And rearrange the forest as you like.
UPDATE Enchanted Forest v3 click each image to zoom in 1. Introduction Scene 2. Reset your character position 3. Closing Credits Scene
Code:
'==========================================================================
'THE ENCHANTED FOREST v.3
'Explore the enchanted forest with your own character, Barbarian or Knight.
'And rearrange the forest as you like.
'
'Need to be improved :
'- Position of the character relative to the objects
'- Collision detection between the character and the objects
'- Boundary of the screen
'
'Acknowledgment
's3d library - by Marcus
'KayKit - Adventurers by Kay Lousberg
' https://kaylousberg.itch.io/kaykit-adventurers?download
'Trees Asset Pack by Aumarka
' https://mark-auman.itch.io/low-poly-trees-asset-pack
'==========================================================================
'----------------
' INITIALIZATION
'----------------
'#win32
include "s3d.n7"; S3D_SetView(primary, rad(45), 0.1, 50)
include "data/s3d_addon.n7"
set window "The Enchanted Forest",1000,600,false
set redraw off
randomize clock()
'color definition
white = [255,255,255]
black = [40,42,54]
gray = [200,200,200]
red = [255,0,0]
'------------
' DISCLAIMER
'------------
set color black; cls; set color white; set caret 50,50; set font 0
wln "DISCLAIMER"
wln
wln "This tiny game is a work of fiction."
wln "It is for eductional purpose only. "
wln "It is as a proof of 3D game concept using s3d library."
wln "It is not intended for commercial use and not for sale"
wln "No person or entity associated with this game received payment"
wln "or anything of value, or entered into any agreement,"
wln "in connection with any game assets used in this game."
wln
wln "All trademarks and game assets are the property of their respective owners."
wln "While every effort is made to acknowledge their works,"
wln "some of the game assets used in in this tiny game may not have"
wln "clear name of the artists/author/creator/developer to be referred with."
wln "It may not include all relevant facts or the most up-to-date information."
wln
wln "Names, characters, places, events and incidents"
wln "are either the products of the author’s imagination"
wln "or used in a fictitious manner."
wln "Any resemblance to actual persons,"
wln "living or dead, or actual events is purely coincidental."
wln
wln "Press ENTER to continue"
redraw
do; wait 1; until keydown(KEY_RETURN,true)
'--------------
' INTRODUCTION
'--------------
i = 0
character.x = 0
character.y = 0
character.z = 0
character.rotate = 200
do
set color black; cls; set color white; S3D_Clear()
'choose your character
if keydown(KEY_C,true) then
i = (i+1)%2
endif
'character.rotate -90=West, 90=East, 0=North, 180=South
if keydown(KEY_LEFT) then
character.rotate = (character.rotate+10)%360
elseif keydown(KEY_RIGHT) then
character.rotate = (character.rotate-10)%360
endif
'information
set color white; set caret 10,10
wln "===================="
wln "INTRODUCTION"
wln character[i].name
wln "===================="
wln
wln "Instructions :"
wln "LEFT, RIGHT to rotate your character"
wln "C to change your character"
wln "ESCAPE to quit this introduction"
redraw
fwait 10
until keydown(KEY_ESCAPE,true)
'-----------
' MAIN LOOP
'-----------
i = 0; j=1
character.x = 2
character.y = 2
character.z = 5
character.rotate = 210
do
set color black; cls; set color white; S3D_Clear()
'choose your character
if keydown(KEY_C,true) then
i = (i+1)%2
endif
'randomize objects
if keydown(KEY_R,true) then
for j = 1 to object.number
object[j] = []
object[j].model = S3D_LoadMesh("data/Tree_Bare.obj", 0.01,-0.01,0.01, false)
object[j].x = rnd(-5,2) ; object[j].y = rnd(0,2)+1 ; object[j].z = rnd(5,15)
next
endif
'show up your character if he is out of screen
if keydown(KEY_U,true) then
character.x = 2
character.y = 2
character.z = 5
character.rotate = 210
endif
'character.rotate -90=West, 90=East, 0=North, 180=South
if keydown(KEY_LEFT,true) then
character.rotate = (character.rotate+30)%360
elseif keydown(KEY_RIGHT,true) then
character.rotate = (character.rotate-30)%360
endif
if keydown(KEY_UP,true) then
if character.rotate = 0 then
character.z = character.z + 0.1
elseif character.rotate = 90 then
character.x = character.x + 0.1
elseif character.rotate = 180 then
character.z = character.z - 0.1
elseif character.rotate = 270 then
character.x = character.x - 0.1
elseif character.rotate > 0 and character.rotate < 90 then
character.x = character.x + 1.2*cos(rad(character.rotate))
character.z = character.z + 1.2*sin(rad(character.rotate))
elseif character.rotate > 90 and character.rotate < 180 then
character.x = character.x - 1.2*cos(rad(character.rotate))
character.z = character.z - 1.2*sin(rad(character.rotate))
elseif character.rotate > 180 and character.rotate < 270 then
character.x = character.x + 1.2*cos(rad(character.rotate))
character.z = character.z + 1.2*sin(rad(character.rotate))
elseif character.rotate > 270 and character.rotate < 360 then
character.x = character.x - 1.2*cos(rad(character.rotate))
character.z = character.z - 1.2*sin(rad(character.rotate))
endif
'boundary
if character.z > 20 then character.z = character.z - 0.5
if character.z < 2.8 then character.z = character.z + 0.5
endif
'lines
set color gray ; cx = width(primary)/2 ; cy = height(primary)/2
for a = 1 to 50 step 0.15 draw line 0,cy+pow(a,7),cx*2,cy+pow(a,7)
for b = -1000 to cx*2+1000 step 230 draw line cx,cy/2,b,cy*2
set color black; draw rect 0,0,cx*2,cy+2,1
'Draw Objects and Character
for j = 1 to object.number
S3D_Draw(object[j].x,object[j].y,object[j].z,object.rotype,object.rotate,object[j].model)
set color white
set caret width(primary)-100,30; wln "Objects";wln "Coordinates"
set caret width(primary)-100,60+j*20
wln j+":"+object[j].x+","+object[j].y+","+object[j].z
next
S3D_Draw(character.x,character.y,character.z,character.rotype,character.rotate,character[i].model)
'information
set color white; set caret 10,10
wln "===================="
wln "The Enchanted Forest"
wln "===================="
wln
wln "Instructions :"
wln "ESC to quit"
wln "R to re-arrange objects"
wln "LEFT, RIGHT to rotate your character"
wln "UP to move forward"
wln "C to change your character"
wln "U to reset your position"
wln
set caret width(primary)-300,30
wln "You are a "+character[i].name
wln
wln "Your Coordinates"
wln int(character.x)+","+int(character.y)+","+int(character.z)
wln
wln "Compass "+character.rotate+ " degrees"
x1 = width(primary)-240
y1 = 190
x2 = x1 + 50*cos(rad(270+character.rotate))
y2 = y1 + 50*sin(rad(270+character.rotate))
draw ellipse x1,y1,50,50
draw line x1,y1,x2,y2
redraw
wait 1
until keydown(KEY_ESCAPE,true)
'-----------------
' Closing Credits
'-----------------
words = []
words[1] = "CLOSING CREDITS"
words[2] = ""
words[3] = ""
words[4] = "A special thanks to Marcus, the creator of Naalaa"
words[5] = "for his dedication, support and encouragement"
words[6] = "in the making of this tiny game."
words[7] = ""
words[8] = "I really appreciate his stepping in"
words[9] = "to develop the fantastic s3d library"
words[10] = "I know he had to put in extra hours"
words[11] = "to catch up on his own work, so thank you very much."
words[12] = "Your expertise was vital for this tiny game."
words[13] = ""
words[14] = "Heartfelt thanks to all the talented artists"
words[15] = "who created the amazing 3D game assets"
words[16] = "I couldn't have made it without them"
words[17] = ""
words[18] = ""
words[19] = ""
words[20] = "s3d library - by Marcus"
words[21] = ""
words[22] = "KayKit - Adventurers by Kay Lousberg"
words[23] = " https://kaylousberg.itch.io/kaykit-adventurers?download"
words[24] = ""
words[25] = "Trees Asset Pack by Aumarka"
words[26] = " https://mark-auman.itch.io/low-poly-trees-asset-pack"
'text animation of the closing credits
for i = height(primary)-30 to 30
set color black; cls; set color white
set caret width(primary)/2,i
for j = 1 to 26
center words[j]
next
redraw
fwait 40
next
do; wait 1; until keydown(KEY_RETURN,true)