Practical Skills

Production Schedule: 

This is the schedule I attempted to follow to produce my FMP successfully.

Week Beginning

Activity / What you are intending to do – including independent study Resources / What you will need to do it – including access to workshops

 10th March 2025

Context Page: Draft the project

proposal, design brief (statement of intent) and conduct a SWOT analysis for the project. Begin setting up the website structure in WordPress using Elementor (create pages for Context, Research, etc.).

Write initial content and gather context information.

WordPress (Elementor) for site setup and layout; Microsoft Word for drafting proposal/brief; Google Search for background research; Apple Notes for brainstorming and note-taking.

17th March 2025

Research Page (Primary & Secondary): Plan and conduct primary research (organise a focus group and create a survey of peers about tortoise-related learning or game interest).

Collect secondary research on documentary techniques, Tamagotchi games, and related case studies. Start summarising findings.

Microsoft Word for writing notes and survey questions.

Google Search and library books for gathering secondary research; Online tools (e.g. Microsoft or Google Forms) for surveys; Apple Notes for recording insights.

 24th March 2025

Research Page (continued): Continue developing the Research page by adding annotated source summaries (annotated bibliography) from both primary and secondary research. Explain how each research finding will inform website design, game features, and documentary style.

Begin transferring content into the WordPress page templates.

Microsoft Word for organising research notes and annotations; Google Scholar/Internet for sourcing references.

Books or articles on documentary and game design.

WordPress/Elementor to format content on the site.

31st March 2025

Practical Skills Page (Trial & Testing): Focus on practical trials. Book and prepare equipment (DSLR camera, tripod, lights, SD card, microphone). Conduct test video shoots and audio recordings for the documentary (framing, lighting, sound). Perform test animations/sketches on FlipAClip to prototype the Tamagotchi game art style. Document trial methods and results.

DSLR camera kit (camera, tripod, lighting, microphone, memory card) for trial footage; FlipAClip app (tablet/iPad) for animation tests; Microsoft Word for documenting trial processes; Apple Notes for quick test notes; Adobe Animate for basic motion tests.

7th April 2025

Problem Solving Page & Game Design: Reflect on Week 4 trials to identify issues (e.g. lighting/sound problems, animation challenges) and plan improvements. Begin designing the Tamagotchi-style game mechanics and interface: create wireframes/mockups in Adobe XD, and prototype animations in Adobe Animate. Draft content for the Problem-Solving page outlining challenges and initial solutions.

Adobe XD for Ul/wireframe design; Adobe Animate for initial game animation prototypes; Microsoft Word to write reflections for Problem Solving page; Apple Notes for jotting fixes and game ideas; FlipAClip for rough animation sketches if needed.

14th April 2025

Practical Skills Page (Filming & Animation): Film the main documentary content using the camera kit (capturing B-roll, interviews, tortoise footage). Record clear audio. Continue animating short segments for the game/story using Adobe Animate and FlipAClip. Populate the Practical Skills page with details of filming/animation processes and any new techniques learned.

DSLR camera kit (for filming); Portable audio recorder or microphone; Adobe Animate for detailed animations; FlipAClip for sketching animation frames; Microsoft Word for notes.

Apple Notes for quick scene ideas; Premiere Pro (if doing quick rough cuts of test footage).

21st April 2025

Practical Skills Page (Editing & Embedding): Begin editing the documentary footage in Adobe Premiere Pro (rough cut: sequence clips, sync sound). Continue animating/refining game assets. Start embedding the Tamagotchi game (animations/interactive elements) into the website using WordPress/Elementor (e.g. using HTML5 canvas or animated

GIF placeholders).

Adobe Premiere Pro for video editing; Adobe Animate for final game animations; WordPress with Elementor for embedding media/game; Microsoft Word for documenting editing workflow; Apple Notes for managing editing checklists.

28th April 2025

Finalise Practical Skills & Problem Solving Pages: Polish the Practical Skills page content. Continue refining the documentary edit (add transitions, titles, colour correction) and finalising animations. Update the Problem-Solving page with specific examples of challenges encountered (e.g. synchronise issues, coding bugs) and how each was resolved. Prepare the short documentary final cut.

Adobe Premiere Pro for final video editing; Adobe Animate and FlipAClip for final animation tweaks; Microsoft Word to write detailed Problem-Solving entries; WordPress (Elementor) to update pages; Google Search or tutorials for troubleshooting tips as needed.

 5th May 2025

Finalisation & Presentation (Exhibition Week): Finalise all project elements. Ensure the Tamagotchi game is fully functional on the site and that all website pages are complete and formatted. Export and upload the finished documentary to the website. Conduct a project presentation or exhibition.

Gather audience feedback via forms or notes.

WordPress/Elementor to upload final game and videos; Adobe Animate for any last-minute tweaks; Adobe Premiere Pro for final documentary export; Microsoft Word/Apple Notes to prepare presentation notes and collect feedback; Google Forms (optional) for feedback collection.

12th May 2025

Evaluation & Submission: Analyse exhibition feedback and reflect on the project’s outcomes. Write the Evaluation page content in Microsoft Word, discussing what went well, what could improve, and learning points. Finalise the website and all documentation. Ensure the entire project is ready for submission by May 16.

Microsoft Word for drafting the Evaluation and final report.

Apple Notes to organise reflection points; Google Search or tutorials for any final formatting help; WordPress/Elementor to do final review of the site.

 

Script:

This is my script which I wrote out in one draft, I sent it out and asked for feedback but didn’t receive any negative or constructive feedback that would require any major changes. For my Voiceover I ensured it was followed clearly whilst for visual side, I used it as more of a guideline as I wanted to make sure the content flowed well. 

Scene 

Video 

Narration Audio  

 

1 

Animated Segment 

 

 

 

 

 

 

 

2Daily Life 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3– Star Moment 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4- Fun Facts with Animation  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5- Navigation 

 

 

 

 

 

 

 

 

 

 

 

 

6– CCTV footage

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

  7– Audience Videos 

 

 

 

 

 

 

 

 

 

8- Finale 

  

Opening scene- Animated 

Mission Impossible style playful animation of a tortoise sneaking around like a secret agent, dodging lasers on a quest to claim the salad from the salad bank. 

 

The animation cuts to real-life footage of tortoise walking casually, completely contradicting the previous scene. 

 

Live-action footage of tortoises  

waking up, basking in the sun 

and moving around their enclosure. 

 

 

Cut to a close-up of a  

tortoise munching on leafy greens  

 

 

 

 

Slow Motion footage of  

tortoises eating. 

 

Close-Up shot of a tortoise

biting into  a leaf. 

 

 

Footage of tortoises Exploring. 

 

 

 

Show Tortoise attempting to

reach a piece of food that is slightly out of reach. 

 

 

They reach the food.  

 

 

Slow-motion shot of a  

tortoise climbing. 

 

 

 

 

 

Graphic of an egg developing to  

an adult tortoise. 

(Egg, Hatchling, Juvenile, Adult) 

 

 

 

 

Animated tortoise with a tiny 

compass, magnifying glass  

and explorers’ hat on map  

leaving a trail of footprints.  

 

Animation of a tortoise being  

gently stroked on its shell, reacting 

to the touch. 

 

 

 

 

 

Footage of a tortoise figuring out how to reach food, nudging objects, or interacting with their environment. 

 

 

 

Footage of a tortoise  

confidently heading toward a food bowl, followed by a humorous cut of someone looking

confused, searching for their keys. 

 

 

 

 

The screen changes to a  

grainy, vintage-style TV.

 

Vintage-Style footage of a

tortoise toppling over  

 

Footage cuts to where the tortoise 

appears to be sitting in the water bowl taking a sneaking poo. 

 

 

A final clip shows the tortoise 

looking directly into the camera, as if  

aware it’s been caught. 

 

(Static crackle as the CCTV screen fades out.) 

 

A fun montage of video clips and photos submitted by tortoise owners—tortoises eating, climbing, interacting with their owners, and even wearing tiny outfits.  

 

Comedic final clip of Tortoise. 

 

 

 

 

 

 

Montage of tortoises walking, eating, and interacting with their environment. 

 

Final shot of a tortoise blinking at the camera, followed by the title card: “The Secret Life of Tortoises. 

 

 

 

Cut to black. 

 

[END] 

 

 

Narrator: Meet the Tortoise. Small and mighty individuals. You may think they live slow, boring lives… but what if I told you, they have a secret world of their own. 

 

 

Okay, maybe not that dramatic… but these small reptiles have more going on than you might think! 

 

 

Tortoises start their day much like we do- waking up, stretching their legs, and heading straight for breakfast. 

 

 And if you think you’re a food lover just watch this. 

 

*ASMR style exaggerated crunching sounds for comedic effect. * 

 

Did you know that tortoises don’t have teeth? Instead, they have a strong, beak-like mouth to tear through tough plants and vegetables! 

 

 

These little guys might not be the fastest creatures, but they are determined.  

 

Watch as *name* takes on this great challenge. Will he make it? The suspense is unbearable. 

 

Success! And you thought tortoises were boring. 

 

 

Fun fact— Tortoises are excellent climbers! Even though their shells look heavy, they use their strong legs to scramble over obstacles in search of food or the perfect sunbathing spot. 

 

Tortoises can live for more than 75 years. That means a baby tortoise today could outlive you! 

 

 

 

 

They also have an incredible sense of direction—if they get lost, they can find their way home using the position of the sun. 

 

And get this—tortoises can actually feel through their shells! It might look like a hard, lifeless shell, but it’s connected to their spine, so they can sense touch, pressure, and even gentle scratches! 

 

 

But they’re not just wanderers—they’re thinkers. Tortoises can solve simple puzzles, recognize their owners, and even remember locations for years! 

 

In fact, studies have shown that tortoises have great memory skills—they can learn a route to food and remember it for up to nine years! That’s better than some of us when trying to remember where we put our car keys! 

 

 

And now, exclusive footage from ‘Tortoise Surveillance HQ.’  

 

 

 

 

 What you are about to see may shock you… this tortoise suffers with I.B.P.I.M.W.B which stands for I be Pooping in My water bowl. 

 

Gross!  

 

 

 

 

 

 

 

Now let’s see what YOUR tortoises have been up to! 

 

*Background  

music: Upbeat, cheerful tune. * 

 

From lazy sunbathers to daring explorers, these little guys sure know how to steal the spotlight! 

 

(laughing) A round of applause for our audience’s superstar tortoises! 

 

* Peaceful music in  

the background. * 

 

 

So next time you see a tortoise, don’t just think ‘slow and steady’—think ‘wise, adventurous, and full of surprises.’ Because the secret life of tortoises… is anything but boring! 

 

Now if you’ll excuse me, I have some tortoise business to attend to… 

 

*The sound of crunching lettuce in the background for comedic effect. * 

 

Storyboards:

Here is an example of a simple storyboard I created, to map out the key scenes of my opening animation. It was very simple to execute as where I wasn’t filming I didn’t have to decide on specific camera angles.

Animations:

Once I had completed my storyboard, I drew out the key scenes in FlipAClip and slowly developed them to flow into each other. I set the frames per second to 8 and had a total of 5 layers to create and organised easy workspace. I used a total of 180 images which took me around 3 hours to create.

 

Here is my completed animation prior to adding any music.

Here are Screenshots of other animations, I developed for the documentary.

Not only did I create short animations within FlipAClip but I also Created my own frames designed to look like a Vintage TV and a DijiCam. 

To use these within my Documentary, I saved them as a PNG and placed them as an overlay on my Documentary footage, in Premiere Pro.

Audio: 

This was the Set-up for my Voiceover audio which was recorded by Stephen James, despite the speculation of it being AI the audio was all real. The microphone seen in the image is a TONOR Cardioid Condenser Computer PC Mic, which allowed me to record a clear, studio-style voiceover in my documentary, The Secret Life of Tortoises. It is a USB plug and Play mic ideal for student creators who need good quality audio on a budget.

Editing:

This set up was extremely successful as soundproofing was extremely effective. This being a home set up in a busy area, I never knew when there could be a sudden siren or an unexpected house noise disrupt the clearness of the audio. This is where soundproofing is essential as it isolates your recording space, effectively creating a pristine audio environment. This dedicated recording space ensured that only the voice for documentary audio is captured, free from distracting external sounds and muddy room reflections. The end result is crystal-clear, professional quality that helped elevate my work to the highest industry standards.

However as it is not the industry standard microphone there was room for improvement, so here is a short step-by-step on how I enhanced the Audio for my Documentary.

To edit my Final Major Project, I used the industry standard softwares Adobe Premiere Pro and Adobe Audition, here are the steps I took.

  • Open a New Save in Premiere pro and Import the Audio
  • Select the audio in Premiere Pro by right clicking and selecting “edit clip in adobe audition”
  • When in Adobe Audition Press “CTRL” and  “A” at the same time to select all audio.
  • Then go to “effects”,  the “special”,  then “mastering” and lastly “make room for vocals”.
  •  Press “CTRL” and “S” at the same time so the new audio is imported into premiere Pro.
  • To then put my images into the correct format, I went to ‘Sequence’ settings and switched the ‘Frame Size’ to 1920 and ‘Horizontal’ to 1080. 
  • To remove all the unwanted content, I used the ‘Razor’ tool and cut clips. I cut them sharply and attempted to make them synchronise with the voiceover and not have any unnecessary pauses as this helps the video feel more fast-paced.
  • Once my videos were  had been trimmed to the correct lengths, I then added a crossfade to the beginning and the end of the clips and also the end of the clip before and the beginning of the clip after.
  • I then went to the ‘Window’ bar at the top selected the text option and then transcript. It takes a while to load but is a quicker alternative to typing out the entire script. Then I pressed add captions and dragged all the sliders to one of the lowest options so there weren’t too many words a once and only one line of text at a time.
  • Finally, to add music I found a copyright free instrumental, copied the link, and downloaded it using a link to mp3 converter. I imported it, went to the ‘Workspace’, and switched it to ‘Audio’. I then opened ‘Music’ and lowered the ‘Clip Volume’ until it no longer overpowered the audio in the video. I then exported my video ready to upload it.
  • Here is the final video:

A small extra piece of content, I also embedded within my website, was a TikTok I created and edited completely in app using the ability to add captions over a video and the “mix” transition between certain clips, which can be seen here:

Assets, Typography, Colour Scheme, and Layout:

Here is everything I used to create a fun and easy to navigate website:

 

To clearly structure the website I used an old font for headings. This helps improve user experience as they  make the page look clearly structured as they they break up text and are simple to read. Additionally, the use of bold writing helps draw attention to key information, which makes the website easily scannable.

In Adobe XD I also created my own assets I would be able to use across my website.

Finally, I carefully planned and designed a cohesive colour palette.

I chose to use green as my main colour because of its positive effects on children’s emotions and learning. Green is interpreted as a calming colour that is often associated with healing and good well-being.  A VeryWellMind.com article uploaded in 2023 proved that by surrounding children with green, it is possible to improve their reading and comprehension abilities, which are qualities that support the educational goal of my FMP.  Additionally, Green is the colour of nature and growth, reinforcing the website and documentaries’ key themes of care for animals and environmental appreciation. Overall, using Green, I aimed to deepen children’s understanding of how to care for the tortoise’s world and foster a gentle curiosity for animals.

Whilst the colour orange is thought to bring warmth and encourage social interaction, cooperation and communication, making it a friendly and welcoming colour. Additionally, it is often seen in playgrounds as it is believed to enhance critical thinking and memory. It can also evoke an autumnal feeling, and a reminder of fruits and flowers, linking to one of my themes, nature

Finally, having yellow accents is essential as orange is commonly associated with happiness and warmth. Combined, they emphasise creating a positive atmosphere around learning. The cheerful colour yellow is also believed to increase mental stimulation. However, if overused, yellow can be seen as overwhelming as it is an intense shade. The colour also relates to the themes of tortoises as it can be seen in the sandy and earthy tones of their habitats and dandelions, and common tortoise food.

Overall, the combination of these colours creates a successful colour palette as it reinforces the theme of nature whilst stimulating children’s minds and engaging them.

Tortoise game:

The Tortoise Tamagotchi is a super simple game that aims to teach children basic care skills. The game’s architecture is PHP, JS, and CSS, utilising shortcode functionality to output code via a basic WordPress plugin. The save states are stored in local Storage/ cookies, meaning no database or save state utility is required. The game’s logic is based on two streams for ‘nurture’ and ‘decay’.

The Mood GIFs were created in XD using over 100+ Individual Images and were then stitched together using an IMG to GIF tool on https://ezgif.com/ .

The Decay state is as follows: Loved → Happy* → Need → Sick or Sad → Off.

*Default State

  • If interacted with ‘Happy’ → ‘Loved’.
  • If no interaction ‘Happy’ → ‘Need’.
  • If ‘Need’ ignored ‘Need’ →  ‘Sick’.
  • If ‘Sick’ ignored ‘Sick’ →  ‘Off’.                                                                                      

The need is chosen randomly, with bias: 

  • 70% chance: Hungry or Thirsty
  • 20% chance: Bored    
  • 10% chance: Smelly                                                                        

 

The Nurture State is as follows Sick or Sad → Healed/Need Met → Happy → Loved.

Need 

Action 

Sick 

VET or SLEEP 

Hungry 

FEED 

Thirsty 

WATER 

Bored 

PLAY 

Smelly 

BATH 

Overuse or Ignore = Decay

Decays for repetitive or ignored actions: 
An Overuse Example is Feed, Feed, Feed = Sick
An Underuse Example is No Play, No Play, No Play, No Play, No Play = Bored.


Here is a screenshot of the Plugin Architecture used to create the game:

Here is the code used within the game:

// Tamagotchi Game Plugin JavaScript

(function($) {
document.addEventListener(‘DOMContentLoaded’, () => {
// ─── Welcome Screen Logic ──────────────────────────────
const overlay = document.getElementById(‘tortoise-welcome-overlay’);
const nameInput = document.getElementById(‘tortoise-name-input’);
const colorInput = document.getElementById(‘tortoise-color-input’);
const startBtn = document.getElementById(‘tortoise-start-btn’);
const errBox = document.getElementById(‘tortoise-welcome-error’);
const gameEl = document.getElementById(‘tortoise-game’);

function isValidName(name) {
return /^[A-Za-z]+$/.test(name);
}
function showError(msg) {
errBox.textContent = msg;
}

startBtn.addEventListener(‘click’, () => {
const name = nameInput.value.trim();
const color = colorInput.value;
if (!isValidName(name)) {
return showError(‘Use letters only, no spaces or symbols.’);
}
localStorage.setItem(‘tortoiseName’, name);
localStorage.setItem(‘tortoiseColor’, color);
gameEl.style.backgroundColor = color;
overlay.style.display = ‘none’;
initGame();
});

const savedName = localStorage.getItem(‘tortoiseName’);
const savedColor = localStorage.getItem(‘tortoiseColor’);
if (savedName && savedColor) {
gameEl.style.backgroundColor = savedColor;
overlay.style.display = ‘none’;
initGame();
}
// ────────────────────────────────────────────────────────

// ─── Game Initialization ───────────────────────────────
function initGame() {
// ─── Configurable Timers ────────────────────────────────
const DECAY_TIME_MS = 20 * 1000;
const SLEEP_TIME_MS = 20 * 1000;
const ANIMATION_DURATION_MS = 2000;
// ────────────────────────────────────────────────────────

// Use the stored name (fallback)
const tortoiseName = localStorage.getItem(‘tortoiseName’) || ‘Your tortoise’;

// ─── Elements & State ───────────────────────────────────
const actions = [‘FOOD’,’WATER’,’BATH’,’VET’,’SLEEP’,’PLAY’];
const menu = document.getElementById(‘action-menu’);
const menuItems = document.querySelectorAll(‘#action-menu li’);
const img = document.getElementById(‘tortoise-img’);
const msgBox = document.getElementById(‘tortoise-message’);
const selectBtn = document.getElementById(‘select-btn’);
let actionIndex = 0,
menuOpen = false,
decayTimer = null;
// ────────────────────────────────────────────────────────

// Update the icon
function updateSelectIcon() {
selectBtn.textContent = menuOpen ? ‘▶️’ : ‘H’;
}

// ─── Action Animations (only PLAY) ──────────────────────
const ACTION_GIFS = {
PLAY: (tortoiseGameData.actionGifs || {}).PLAY || ”
};
function playActionAnimation(action, next) {
if (action !== ‘PLAY’ || !ACTION_GIFS.PLAY) {
return next();
}
clearDecayTimer();
img.src = ACTION_GIFS.PLAY;
setTimeout(next, ANIMATION_DURATION_MS);
}
// ────────────────────────────────────────────────────────

// ─── Mood & Decay Pipeline ──────────────────────────────
const DECAY_PIPELINE = [‘happy’,’need’,’sick’,’blackout’];
const defaultState = {
mood: ‘happy’,
lastAction: null,
interactionCount: 0,
sleepUntil: null,
lastInteraction: Date.now(),
actionHistory: []
};
let state = JSON.parse(localStorage.getItem(‘tortoiseState’)) || defaultState;
const moodImages = tortoiseGameData.images;
saveState();

function saveState() {
state.lastInteraction = Date.now();
localStorage.setItem(‘tortoiseState’, JSON.stringify(state));
}
function clearDecayTimer() {
if (decayTimer) clearTimeout(decayTimer);
decayTimer = null;
}
function showMessage(text = ”) {
// coerce to string — never undefined
const str = String(text);
const displayText = str.replace(/Your tortoise/g, tortoiseName);
msgBox.textContent = displayText;
msgBox.classList.remove(‘hidden’);
setTimeout(() => msgBox.classList.add(‘hidden’), 3000);
}
function updateMood(mood) {
clearDecayTimer();
state.mood = mood;
img.src = moodImages[mood] || moodImages[‘sad’];
document.body.className = `tortoise-${mood}`;
saveState();
if (mood === ‘love’ || mood === ‘happy’) scheduleIdleDecay();
}
function scheduleIdleDecay() {
clearDecayTimer();
let steps = DECAY_PIPELINE.slice();
if (state.mood === ‘love’) steps.unshift(‘happy’);
if (steps[0] === state.mood) steps.shift();
(function run(i) {
if (i >= steps.length) return;
decayTimer = setTimeout(() => {
const next = steps[i];
if (next === ‘need’) {
updateMood(‘happy’);
showMessage(‘Still happy…’);
setTimeout(() => {
const needs = [‘hungry’,’thirsty’,’bored’,’smelly’];
const n = needs[Math.floor(Math.random() * needs.length)];
updateMood(n);
showMessage(`${tortoiseName} is now ${n}.`);
run(i + 1);
}, DECAY_TIME_MS);
} else if (next === ‘blackout’) {
enterBlackout();
} else {
updateMood(next);
if (next === ‘sick’) showMessage(`${tortoiseName} feels sick…`);
run(i + 1);
}
}, DECAY_TIME_MS);
})(0);
}

// ─── Break Overlay ──────────────────────────────────────
function enterBlackout() {
clearDecayTimer();
updateMood(‘blackout’);
const overlay = document.createElement(‘div’);
overlay.id = ‘tortoise-blackout’;
overlay.style = `
position:fixed; top:0; left:0;
width:100%; height:100%;
background:#000; color:#fff;
display:flex; align-items:center;
justify-content:center; flex-direction:column;
z-index:9999;
`;
overlay.innerHTML = `
<p>${tortoiseName} needs a break.</p>
<button id=”tortoise-return”>Return</button>
<button id=”tortoise-reset”>Reset</button>
`;
document.body.appendChild(overlay);
document.getElementById(‘tortoise-return’).addEventListener(‘click’, () => {
document.body.removeChild(overlay);
});
document.getElementById(‘tortoise-reset’).addEventListener(‘click’, () => {
localStorage.removeItem(‘tortoiseName’);
localStorage.removeItem(‘tortoiseColor’);
localStorage.removeItem(‘tortoiseState’);
location.reload();
});
}

// ─── Periodic Wake‐up ───────────────────────────────────
setInterval(() => {
if (!state.sleepUntil) return;
const now = Date.now();
if (now >= state.sleepUntil) {
state.sleepUntil = null;
const wake = Math.random() < 0.5 ? ‘hungry’ : ‘thirsty’;
updateMood(wake);
showMessage(`${tortoiseName} woke up and is now ${wake}.`);
state.interactionCount = 0;
}
}, 1000);

// ─── Main Action Processing ────────────────────────────
function processAction(action) {
const now = Date.now();

// 1) Vet cures any sickness
if (state.mood === ‘sick’ && action === ‘VET’) {
updateMood(‘happy’);
state.interactionCount = 0;
return showMessage(`${tortoiseName} is all better, thanks to the vet!`);
}

// 2) Sleep blocking / trigger
if (state.sleepUntil && now < state.sleepUntil) {
return showMessage(`Sleeping: ${Math.ceil((state.sleepUntil – now)/1000)}s left.`);
}
if (action === ‘SLEEP’) {
updateMood(‘asleep’);
state.sleepUntil = now + SLEEP_TIME_MS;
saveState();
return showMessage(`Zzz… sleeping ${Math.ceil(SLEEP_TIME_MS/1000)}s`);
}

// 3) Automatic wake-up
if (state.sleepUntil && now >= state.sleepUntil) {
state.sleepUntil = null;
const wake = Math.random() < 0.5 ? ‘hungry’ : ‘thirsty’;
updateMood(wake);
state.interactionCount = 0;
showMessage(`Woke up ${wake}`);
}

// 4) Interaction count → tired
state.interactionCount++;
if (state.interactionCount >= 30) {
updateMood(‘tired’);
return showMessage(`${tortoiseName} is tired – let it sleep!`);
}

// 5) Immediate need-fix
const fixMap = { hungry:’FOOD’, thirsty:’WATER’, bored:’PLAY’, smelly:’BATH’ };
if (fixMap[state.mood] === action) {
updateMood(‘happy’);
state.interactionCount = 0;
return showMessage({
hungry: ‘Yum!’,
thirsty: ‘Ahh!’,
bored: ‘That was fun!’,
smelly: ‘So fresh!’
}[state.mood]);
}

// 6) Over-use penalties
if ((state.mood === ‘happy’ || state.mood === ‘love’) && action === state.lastAction) {
if (action === ‘FOOD’ || action === ‘WATER’) {
updateMood(‘sick’);
return showMessage(‘Too much!’);
} else {
updateMood(‘tired’);
return showMessage(‘Overdoing it!’);
}
}

// 7) Happy > Love
if (state.mood === ‘happy’ &&
[‘FOOD’,’WATER’,’BATH’,’PLAY’].includes(action) &&
action !== state.lastAction) {
updateMood(‘love’);
state.lastAction = action;
return showMessage(‘❤️’);
}

// 8) Maintain Love
if (state.mood === ‘love’ &&
[‘FOOD’,’WATER’,’BATH’,’PLAY’].includes(action) &&
action !== state.lastAction) {
state.lastAction = action;
return;
}

// 9) Track history for unmet-needs
state.actionHistory.push(action);
if (state.actionHistory.length > 10) state.actionHistory.shift();

// 10) Unmet-needs detection
for (const [act, need] of Object.entries({
FOOD: ‘hungry’,
WATER: ‘thirsty’,
PLAY: ‘bored’,
BATH: ‘smelly’
})) {
if (!state.actionHistory.includes(act)) {
updateMood(need);
return showMessage(`${tortoiseName} is ${need}.`);
}
}

// 11) Default save
state.lastAction = action;
saveState();
}

// ─── Wrapper to play PLAY-GIF then logic ───────────────
function handleAction(action) {
playActionAnimation(action, () => processAction(action));
}

// ─── Controls Binding & Icon Init ──────────────────────
document.getElementById(‘scroll-btn’).addEventListener(‘click’, () => {
if (!menuOpen) {
menu.classList.remove(‘hidden’);
actionIndex = 0; highlightAction(0);
menuOpen = true; updateSelectIcon();
} else {
actionIndex++;
if (actionIndex >= actions.length) {
menu.classList.add(‘hidden’);
menuOpen = false; updateSelectIcon();
actionIndex = 0;
} else {
highlightAction(actionIndex);
}
}
});

selectBtn.addEventListener(‘click’, () => {
if (menuOpen) {
handleAction(actions[actionIndex]);
menu.classList.add(‘hidden’);
menuOpen = false;
updateSelectIcon();
} else {
enterBlackout();
}
});

function highlightAction(i) {
menuItems.forEach((li,j) => li.classList.toggle(‘active’, i === j));
}

// ─── Initial Setup ─────────────────────────────────────
updateSelectIcon();
updateMood(state.mood);
showMessage(`${tortoiseName} is waiting…`);
}

});
})(jQuery);

Update js that controls the tamagotchi. Why this is different. Updates needs mapping, in the previous version there were too many opportunities for certain actions to override other actions that it got complicated. This simplifies it down to need + action = increase in happiness, consistent actions met = level up + loved and that all controlled with this chunk of code:

// Actions
function processAction(action) {
const now = Date.now();

// 1) Vet cures any sickness
if (state.mood === ‘sick’ && action === ‘VET’) {
updateMood(‘happy’);
state.interactionCount = 0;
return showMessage(`${tortoiseName} is all better, thanks to the vet!`);
}

// 2) Sleep blocking / trigger
if (state.sleepUntil && now < state.sleepUntil) {
return showMessage(`Sleeping: ${Math.ceil((state.sleepUntil – now)/1000)}s left.`);
}
if (action === ‘SLEEP’) {
updateMood(‘asleep’);
state.sleepUntil = now + SLEEP_TIME_MS;
saveState();
return showMessage(`Zzz… sleeping ${Math.ceil(SLEEP_TIME_MS/1000)}s`);
}

// 3) Automatic wake-up
if (state.sleepUntil && now >= state.sleepUntil) {
state.sleepUntil = null;
const wake = Math.random() < 0.5 ? ‘hungry’ : ‘thirsty’;
updateMood(wake);
state.interactionCount = 0;
showMessage(`Woke up ${wake}`);
}

// 4) Interaction count > tired
state.interactionCount++;
if (state.interactionCount >= 30) {
updateMood(‘tired’);
return showMessage(`${tortoiseName} is tired – let it sleep!`);
}

// 5) Immediate need-fix
const fixMap = { hungry:’FOOD’, thirsty:’WATER’, bored:’PLAY’, smelly:’BATH’ };
if (fixMap[state.mood] === action) {
updateMood(‘happy’);
state.interactionCount = 0;
return showMessage({
hungry: ‘Yum!’,
thirsty: ‘Ahh!’,
bored: ‘That was fun!’,
smelly: ‘So fresh!’
}[state.mood]);
}

// 6) Over-use penalties
if ((state.mood === ‘happy’ || state.mood === ‘love’) && action === state.lastAction) {
if (action === ‘FOOD’ || action === ‘WATER’) {
updateMood(‘sick’);
return showMessage(‘Too much!’);
} else {
updateMood(‘tired’);
return showMessage(‘Overdoing it!’);
}
}

// 7) Happy > Love
if (state.mood === ‘happy’ &&
[‘FOOD’,’WATER’,’BATH’,’PLAY’].includes(action) &&
action !== state.lastAction) {
updateMood(‘love’);
state.lastAction = action;
return showMessage(‘❤️’);
}

// 8) Maintain Love
if (state.mood === ‘love’ &&
[‘FOOD’,’WATER’,’BATH’,’PLAY’].includes(action) &&
action !== state.lastAction) {
state.lastAction = action;
return;
}

// 9) Track history for unmet-needs
state.actionHistory.push(action);
if (state.actionHistory.length > 10) state.actionHistory.shift();

// 10) Unmet-needs detection
for (const [act, need] of Object.entries({
FOOD: ‘hungry’,
WATER: ‘thirsty’,
PLAY: ‘bored’,
BATH: ‘smelly’
})) {
if (!state.actionHistory.includes(act)) {
updateMood(need);
return showMessage(`${tortoiseName} is ${need}.`);
}
}

Here is what the final product looks like:

However, the Exhibition it became evident that some people had struggles with understanding how the game worded at first so with the small amount of time I had left, alongside writing my evaluation, I decided to add an instruction manual into the menu drop down (the 3 lines in the top right). Also, if you long press buttons the description for the icon will appear above. I felt as though this was a necessary change this provided clarity on how the game worked.

In conclusion, I can confidently say with a 4.92 star rating, I am satisfied with the outcome, as it successfully captured the unique character and complexity of the shelled reptiles, presenting them in a manner that was simultaneously accessible, entertaining, and educational. Through strategically incorporating interactivity, narrative charm, and clear visual storytelling, the documentary exceeded the limitations of a simple passive viewing experience, evolving into an immersive learning journey. Whilst the Exhbition and Self-Evaluation highlighted potential refinements, the project as a whole represents a significant creative and educational achievement, and I am genuinely proud of the final outcome of this independent Final Major Project.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top