I have created a MVP with a number of AI behaviours. Whilst the game is not the finished article I would of liked, it does demonstrate the key components.
The main missing routine is the dragon health and movement, these are almost replicate of the monster-health and hero-consume routines for monster, but rather than dying, health would be decreased. As and when time allow I will revisit it, but wanted to get a submission in that at least shows a capability.
I have thoroughly enjoyed this module, and its not something I would of been able to do without this course. The level of understanding around gaming and AI, in particular NetLogo Agents, has been really good in progressing me from 0 to something playable and fun to work on.
Our hero now has health (albeit as a text value) and random spawning Gelatinous Cube’s!
The Gelantious Cube cannot be attacked with normal weapons, it just consumes them. The only way to defat a gelantious cube is that it will smear our hero, reducing his health ! As the cubes are randomly spwaning the are a dangerous collective ! The cubes, unlike the monsters, do not follow a path, they move randomly square to square, so our hero stands a chance of avoiding them by quick movements !
Snippets of the relevant cube creation, movement and consume are given below, as is the food and drink routines to increase health, please note this is almost pseudo code as they are not within their procedures.
;; if we encounter a cube, we cannot defeat it, only reduce our health by 5
if any? cubes-here
[ set health health - 5
ask cubes-here [ die ] ]
;;
;;
;; cubes moving on a random-path
to move-cube ;; observer procedure for cube
ask cubes
[ ;if cube-eaten?
choose-heading
fd 1
]
end
;; cube spawn routine, the coundown value reduces or increases the number of cubes being generated
to make-cube ;;
ifelse next-cube-in = 0
[ set next-cube-in 3 ]
[ let cube-patch one-of patches with [treasures-grid? and
not any? bonuses-here and
not any? treasures-here]
if cube-patch != nobody
[ ask cube-patch
[ sprout-cubes 1
[ set shape "square"
set heading 0
set color one-of base-colors
set value (random 10 + 1) * 100
set cube-countdown random 200 + 50 ] ]
set next-cube-in 10 + random 1 ] ]
end
;;
;; food and drink
;; food
if any? foods-here
[ set health health + 9
ask foods-here [ die ]
]
;; drink
if any? drinks-here
[ set health health + 5
ask drinks-here [ die ]
]
Having played the initial walk thru, the placement of the keys makes the levels less challenging. In this video i adjust the positon of the keys, upon I discover the path to the output map is incorrect
I update the path to the map and show how this is done on teh command line, and then a little bit of version control, explaning the need for sustained resliency (local backups) and disaster recovery (remote backups) to ensure a project is not impacted by a individual failure.
In the video our hero can now pick up keys and walk thru doors.
This is accomplished by checking the tile ahead and wether our hero has the key. We also report in the GUI the ‘has-key’ value to show that the key is being consumed.
Firstly, in the ‘globals’ we create variables for storing the has-key value
has-red-key;
has-yellow-key;
has-green-key;
And in the GUI create a reporter that returns that value
We then need to know when our hero has encountered a key, consume it, then remove it from the dungeon.
to consume ;;
..
;; red key
if any? red-keys-here
[ set has-red-key 1
ask red-keys-here [ die ]
]
Then to be able to move around, and only go thru doors when the relevant keys are held
if [pcolor] of patch-ahead 1 = black
[ fd 1 ]
if [pcolor] of patch-ahead 1 = yellow and has-yellow-key = 1
[ fd 1 ]
if [pcolor] of patch-ahead 1 = green and has-yellow-key = 1
[ fd 1 ]
if [pcolor] of patch-ahead 1 = red and has-red-key = 1
[ fd 1
set level-over? true ]
Notice that when our hero can reach the red-door it is considered the end of the game, this logic will be further improved to only allow the red-door to be used once the dragon is also slayed.
First walk thru of the Dragon game. I encounter some expected, and not so expected issues.
The ‘seek’ of the monsters is working, as is wall detection. The detection of food and drink is not there, but the procedures are not coded, so to be expected. When our hero encounters the first yellow door, he cannot pass, as he doesnt have the yellow key, as expected as the procedures are not there.
The first task on the game was to import the custom graphics for the dragon, food and keys.
When setting up the game for the first time, there were numerous errors, to be expected as game doesnt know ‘breeds’ for our ‘heros’ and ‘dragons’.
And the new values I want to present in the GUI require code to complete them.
At this point as I had completed a susbstanital amount of code locally, I commited all the code to version control software (VCS) – namely a local copy of Gitlab. This is setup to backup to my local Network Attached Storage, which in turn is also backed up to Amazon Web Services (AWS) S3 for both Sustained Resiliency (SR) and Disaster Recovery (DR). Not is only good practice to make regular commits to a VCS to track changes, it removes the failure of a single component (i.e. developer HDD) as potential source of project disruption.
Whilst there is no Continuous Integration / Continuous Delivery Pipeline, this would be something I will explore later, at least methods for code validate so pushes to ‘master’ will always contain working code.
Having completed enough to create an initial map i set about designing the level.
For the first part our hero will have no ‘Hero Mode’ activations, and will have to avoid the in-place monsters (which will seek) and the random spawn monsters (which will just move randomly).
The map design ensures our hero has enough to make risky moves that increase in skill/dexterity to complete, but are awarded higher scores. The gaps in the walls are intentionally off-set to the entrance making the hero cross the room, but if the treasure is to be avoided in the later stages, a dash across the room can be made, but at a lower score.
The food and drink is added, with more towards the of the level ready to combat the dragon. The dragon will have ‘health’ which will require several attacks in hero mode to win, also the special red key will need to be picked up to allow our hero to escape, having defeatd the dragon with all his treasures !
I made code updates in the designer to reflect the button modes and actions, i.e.
and to create hero mode required adjust the shape and action within the code
to place-pellet
ask patch (round mouse-xcor) (round mouse-ycor)
[
ifelse pcolor != black
[ user-message "You cannot place a treasure on top of a wall or a gate." ]
[
if not any? turtles-here
[
sprout-treasures 1
[
set color yellow
set powerup? false
set shape "box"
]
set treasures-grid? true
set pcolor black
]
]
]
end
to hero-mode
if any? treasures-on patch mouse-xcor mouse-ycor
[
ask one-of treasures-on patch mouse-xcor mouse-ycor
[
set powerup? not powerup?
ifelse powerup?
[ set shape "circle" ]
[ set shape "pellet" ]
while [ mouse-down? ] [ ] ;; wait until mouse button is released
]
]
end
The next step is within the game-code to add the additional code to update the UI, with values for each of the keys and also the dragon health, as well as the spawning of random monsters thru out the dungeon.
Our ‘end level’ monster in the maze will the scary dragon. The Dragon will guard the final red key to exit the game. To defeat the dragon it will require maxium health and a power-up pill at the same time, so timing is critical – placement of these will ensure that it will be challenging, but not impossible.
Firstly, there was no dragon icon, so i created one. I found a knitting patten to copy as these are quite ‘blocky’ like the graphic editor.
Creating a button and associated code was an iteration of the key placements
breed [ dragons dragon ]
;
if tool = "Place Dragon"
[ place-dragon]
;
to place-dragon
ifelse [pcolor] of patch round mouse-xcor mouse-ycor != black
[ user-message "You must place the key on a corridor space, not a wall or a gate." ]
[
ask dragons
[ setxy (round mouse-xcor) (round mouse-ycor) ]
]
end
Whereby i was able to add the dragon to the designer
dragon added to editor and placed
Whilst the images currently look quite small, this will be corrected when the ‘setup’ adjust the world and patch sizes so they become more visable.
Our Hero in game-play will have an energy bar, ranging from 0 to 100. When encountering monsters, energy will be reduced. Some designs of the map will require the hero to face the monsters and energy to be lessened, as there will be no power-up available to kill the monster.
With this placement of food and drink will have tactical positions so our hero can progress thruout the maze. For this the maze designer has food and drink buttons and associated breeds and procedures to support them. As no graphics for food or drink existed, these were created in the designer.
tasty chicken
refreshing beer
food and drink in designer
Because more than one food or drink is required, these are not created on ‘setup’ when the level is created, instead when the tool is selected and the mouse clicked, the patch is queried and when black, i.e. empty, a food or drink item is sprouted, i.e.
to place-food
ask patch (round mouse-xcor) (round mouse-ycor)
[
ifelse pcolor != black
[ user-message "You cannot place food on top of other objects." ]
[
if not any? turtles-here
[
sprout-foods 1
[
set color brown
set shape "food"
]
set treasures-grid? true
set pcolor black
]
]
]
end
I can now create food and drink for our hero to battle our monsters and dragon !
tasty chicken wings and beer for our heroes health
Starting with the pac-man maze designer, i added new buttons and updated the existing code to use hero, monsters and treasure.
New Buttons Added, Doors, Keys, Food & Drink ; Hero and Monsters changed
Creating the code for the button calls on the function values supplied in the button i.e.
Set tool value based on the button
;; Green Door
if tool = "Draw Green Door"
[ draw-boundary green ]
;; Red Door
if tool = "Draw Red Door"
[ draw-boundary red ]
if tool = "Draw Yellow Door"
[ draw-boundary yellow ]
Which when applied creates the required doors
Different coloured doors which will only be accessible when holding the correct keys
The next step was to create the key. As there was no key graphic, the netlogo shap editor was used to create one.
green key creation
Then the code to support the creation and placement
breed [ green-keys green-key ]
;;
create-green-keys 1
[
set color green
set shape "green key"
setxy 10 10
]
;;
to place-greenkey
ifelse [pcolor] of patch round mouse-xcor mouse-ycor != black
[ user-message "You must place the key on a corridor space, not a wall or a gate." ]
[
ask green-keys
[ setxy (round mouse-xcor) (round mouse-ycor) ]
]
end
When setting up the new level, the green key is now available to place.
doors and keys created
In the actual game i will now be able to have a register for ‘keys’ and when the hero encounters the key, take it and be able to pass the green door.