TMNT PRO EBLAN IDI HAXUY

In Progress TMNT: PRO EBLAN IDI NAHUY (18+ NSFW) 1.2.

No permission to download
The project is currently under development.
Hi everyone! I need some help. In my JumpAttack animations, the character still turns left and right when I press the directional keys, even though I have air_control jump_x_adjust set in the character header. How can I disable this turning? (OpenBOR v.4)

I also tried setting air_control none, but the character still turns when I press left or right during the animation. This issue didn't exist in OpenBOR v.3.
 
Sound Test is a fully functional hidden music player implemented via OpenBOR scripts (C-Script). It allows the player to listen to the game's soundtrack outside of combat.
Here is a breakdown of its functional and visual features:
1. Activation System (CHEAT CODE)
  • Hidden Entry: The menu is not available by default. It is activated on the Title Screen using a classic "cheat code" (D-pad sequence: Up, Down, Left, Right).
2. Interface and Visualization (UI)
  • Dynamic Background: A clean black screen with informative labels rendered via drawstring.
  • Interactive List: Displays not just the track number, but also its title (e.g., "ALLEYCAT BLUES"), which updates in real-time as you scroll.
  • Visualizer (Equalizer): 12 bouncing green bars with heights driven by a sine wave, simulating a rhythmic reaction to the music.
  • Peak Hold Indicators: White dots above the equalizer that drift downward, creating the look of a high-end professional audio system.
  • Color Feedback: The equalizer bars turn red when they cross a specific height threshold, simulating an audio peak.
3. Controls (Player Logic)
  • Navigation (Left/Right): Scroll through a library of 13 tracks (for now...).
  • Volume (Up/Down): Smooth volume adjustment from 0 to 100, featuring a blue visual progress bar.
  • Playback (Attack): Play the currently selected track.
  • Shuffle (Jump): Picks a random song from the list based on the system's elapsed time.
  • Safe Exit (Start/Quit): Upon returning to the Main Menu or starting a level, all Sound Test scripts automatically shut down, clearing the screen and restoring player controls.
Summary: This is more than just a sound list; it is a retro-arcade-style media player that adds depth and "90s-style secrets" to the game.
 
The Sound Test system looks professional! Are the bars in drawbox or are they models? Excellent job!
 
Here is the final list of implemented features:
1. Access & Activation System

  • Secret Entry: The menu is accessible only via a classic "cheat code" (Up, Down, Left, Right) on the Title Screen.
  • Secure Transition: Utilizes a branching system (jumptobranch) to correctly transition the player to the music player and back.
2. Advanced Interface (UI/UX)
  • Interactive Tracklist: The player supports 13+ tracks with real titles (e.g., "ALLEYCAT BLUES").
  • Scrolling Ticker Tape: A continuous information bar at the bottom displays the current song title and author credits, separated by a distinct white line.
  • "Audio Stats" Info-Panel: A dedicated corner display showing dynamic data, including a flashing REC icon and audio format status.
3. Visual Effects (VFX)
  • VHS Distortion: Authentic retro-tape effect featuring noise, scanlines, and characteristic frame jitter.
  • Chromatic Aberration: "Glitchy TV" effect on the header with distinct red and blue color separation.
  • Disco Lights: The background rapidly cycles through various colors in sync with the music, creating a party atmosphere.
4. Interactive Elements & Animation
  • Dancing Squad: All four Turtles (Leo, Raph, Mikey, Donnie) jump in unique rhythms synchronized with the equalizer.
  • Visual Feedback: A white screen flash triggers upon track switching or playback, providing a powerful response to player input.
5. Technical Logic (Engine)
  • CPU LOAD System: Simulated processor load that spikes to 99% during player actions and realistically "cools down."
  • Smart Reset: The system automatically disables all Sound Test effects when entering the Password menu, Options, or starting a New Game.
 
A custom music player implemented on the OpenBOR engine using C-Script. This is more than just a menu; it's a full simulation of a retro gadget, rendered from scratch using geometric primitives.
Key Features:

  • Dynamic Boombox: A fully animated boombox (rendered entirely via drawbox).
  • Mechanical Logic: Features a retractable antenna and rotating cassette reels.
  • VFX Suite: Includes VHS effects (noise, scanlines), Chromatic Aberration, and screen jitter (Shake).
  • Live UI: 12-band equalizer, scrolling Ticker Tape, and a technical info-panel with simulated CPU LOAD.
  • Interactive Squad: A levitating turtle squad, perfectly synchronized with the rhythm.
 
Well done, great technical performance !
There's just a bit too much noise and interference on the screen:
a few scans and some snow would be enough, I think.
 
A custom music player implemented on the OpenBOR engine using C-Script. This is more than just a menu; it's a full simulation of a retro gadget, rendered from scratch using geometric primitives.
The idea is great, but I think there is too much things happening at the same time. Everything moves and blinks way too much (for example, the CPU box should not float like that), the noise and scanline are way too strong and those purple and blue rectangles makes everything too noisy to read.
 
Отличная работа, великолепная техническая реализация!
На экране слишком много шума и помех:
думаю, нескольких сканирований и немного снега было бы достаточно.
Thanks for the rating! I agree, there was too much visual noise. In the latest update, I removed the VHS effect, extra stripes, and the CPU indicator to make the interface cleaner and keep the focus on the music. I kept only the essentials to maintain that retro vibe.
 
The idea is great, but I think there is too much things happening at the same time. Everything moves and blinks way too much (for example, the CPU box should not float like that), the noise and scanline are way too strong and those purple and blue rectangles makes everything too noisy to read.
Thanks! Yeah, I definitely overdid it with the effects. I've already removed the extra ones to clean things up.
 
These are good ideas, and the on-screen effects should be used sparingly to make it easy and immediate for the player to understand
(so they know at a glance what they're dealing with).
 
Dialogue System:
1. Intro (General view):
"Today, I’m showcasing the dynamic dialogue system I built for my OpenBOR mod. It’s not just static text—it’s a full-fledged story mechanic that completely changes the game's atmosphere."
2. Technical Features (Window slide-in):
"The first thing you'll notice is the entrance animation. The dialogue box smoothly slides up from the bottom of the screen, and the game automatically pauses at the same time."
3. Typewriter Effect:
"The text doesn't just pop up instantly. I implemented a typewriter effect where each letter appears one by one with its own sound effect. It gives the game that classic 16-bit retro feel and makes reading through the story much more engaging."
4. Dynamic Portraits (Key Feature):
"The coolest part of the system is the variability. If you’re playing as Leonardo, he’ll say one thing. But if you’re playing as Raphael or Michelangelo, the system automatically detects the character and swaps in their unique lines and portrait. By the way, the portraits are pulled directly from the character select menu—this saves memory and keeps the art style consistent."



Sound Test Updates:
"When you enter a cheat code, text now appears on the screen to confirm it was done correctly.
I realized I overdid it with the effects before—the interface was cluttered with old film filters, VHS scanlines, and CPU data. I decided to strip away the noise for a cleaner, more polished look. Now, there’s nothing to distract you from the soundtrack, and the menu itself feels faster and more responsive."
 
Basically, you need to create a "dummy" 3D level. In your level text file, define it like this:
C:
updated data/scripts/updated.c
Music Data/Music/big_apple.ogg 1
Order a
BGSpeed 0
Direction both
CameraType 0
NoTime 1
SetTime 0
NoJoin 1
NoPause 0
Scrollspeed 1
Type 2
spawn1 0 50
spawn2 100 150
Light -200 150
At 0
#Objects------------------------------------------------------------------------------#
Then, add these functions to the end of your updated.c script:
C:
void draw_road_item(void sprite, int dist, int side) {
if(!sprite) return;
int screen_w = 480;
int horizon_y = getglobalvar("current_h_val");
int road_curve = getglobalvar("road_curve");
if(road_curve == NULL()) road_curve = 0;
// Perspective logic: dist 1000 (far) -> 0 (near player)
if(dist < 50 || dist > 950) return;
int inv_dist = 1000 - dist;
int scale = (inv_dist * 256) / 1000; // Scale 0-256
// Y Position
int y_pos = horizon_y + (inv_dist * 172 / 1000);
// X Position with curve factor
int road_w = 40 + (inv_dist * 2 / 10);
int shift = (road_curve * inv_dist * inv_dist) / 300000;
int x_pos = (screen_w / 2) + shift + (side * road_w / 2);
// Object offset from the road edge
if(side > 0) x_pos += (15 * scale / 256);
else x_pos -= (45 * scale / 256);
setdrawmethod(NULL(), 1, scale, scale, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL());
drawsprite(sprite, x_pos, y_pos - (80 * scale / 256), 10, 0);
setdrawmethod(NULL(), 0, 256, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL());
}
// MAIN ROAD RENDERING FUNCTION
void draw_pseudo_3d_road() {
int screen_w = 480;
int screen_h = 272;
int horizon_y = 100;
int time = openborvariant("elapsed_time");
// 1. HILL PARAMETERS (Sine wave on integers)
int hill_wave = (time / 4) % 360;
int hill_offset = (sin(hill_wave) * 20) / 1000;
int current_horizon = horizon_y + hill_offset;
setglobalvar("current_h_val", current_horizon);
// 2. TRACK DATA
int road_offset = getglobalvar("road_pos");
int main_curve = getglobalvar("road_curve");
if(main_curve == NULL()) main_curve = 0;
if(road_offset == NULL()) road_offset = 0;
// --- SKY (Gradient) ---
int s;
for(s = 0; s < current_horizon; s += 5) {
int sky_r = 20 + (s / 4);
int sky_g = 40 + (s / 2);
int sky_b = 150 + (s / 3);
drawbox(0, s, screen_w, 5, 1, rgbcolor(sky_r, sky_g, sky_b), 0);
}
// --- FOG ---
drawbox(0, current_horizon - 4, screen_w, 4, 3, rgbcolor(120, 160, 230), 0);
// --- ROAD RENDERING LOOP ---
int road_h = screen_h - current_horizon;
int i;
for(i = 0; i < road_h; i += 2) {
int perspective_factor = (road_h - i);
int shift = (main_curve * perspective_factor * perspective_factor) / 3000;
int road_w = 40 + (i * 2);
int x1 = (screen_w / 2) - (road_w / 2) + shift;
// Alternating stripes (Moving forward)
int is_alt = ((i * 4 + (800 - (road_offset % 800))) % 160 > 80);
int col_grass = is_alt ? rgbcolor(15, 80, 15) : rgbcolor(25, 110, 25);
int col_road = rgbcolor(50, 50, 60);
int col_side = is_alt ? rgbcolor(220, 220, 220) : rgbcolor(180, 0, 0);
drawbox(0, current_horizon + i, screen_w, 2, 5, col_grass, 0);
drawbox(x1, current_horizon + i, road_w, 2, 6, col_road, 0);
int side_w = 2 + (i / 12);
drawbox(x1 - side_w, current_horizon + i, side_w, 2, 7, col_side, 0);
drawbox(x1 + road_w, current_horizon + i, side_w, 2, 7, col_side, 0);
if (is_alt) {
int line_w = 2 + (i / 20);
drawbox(x1 + (road_w / 2) - (line_w / 2), current_horizon + i, line_w, 2, 8, rgbcolor(255, 255, 255), 0);
}
}
}
Finally, integrate the logic into your void main() in updated.c:
C:
// --- PSEUDO-3D ROAD INTEGRATION ---
// Condition: in level
if(openborvariant("in_level")) {
int is_p = getglobalvar("is_pass_active");
int is_s = getglobalvar("is_soundtest");
int is_d = getglobalvar("d_active");
if(is_p != 1 && is_s != 1 && is_d != 1) {
// Checking if we are in the racing level via a custom global var
if(getglobalvar("Show") == "X") {
draw_pseudo_3d_road();
}
}
}
// Logic for movement and curves
if(openborvariant("in_level") && getglobalvar("Show") == "X") {
int r_pos = getglobalvar("road_pos");
if(r_pos == NULL()) r_pos = 0;
setglobalvar("road_pos", r_pos + 20); // Driving speed
// Smooth curving logic
int r_cur = getglobalvar("road_curve");
if(r_cur == NULL()) r_cur = 0;
// Example scenario: turn right at 1000m, turn left at 4000m
int target = 0;
if(r_pos > 1000 && r_pos < 3000) target = 100;
else if(r_pos > 4000 && r_pos < 7000) target = -150;
else if(r_pos > 5000 && r_pos < 6000) setglobalvar("target_curve", 80);
if(r_cur < target) r_cur += 1;
if(r_cur > target) r_cur -= 1;
setglobalvar("road_curve", r_cur);
}
} // Main function closing bracket
This is how I implemented it in my project. Let me know what you think!
 
Last edited:
Important Note:
To make draw_road_item work, you'll need to pre-load your sprites (trees, signs, etc.) in a separate script or at the start of the level using getspritexxx or by assigning them to global variables.
For example, in your oncreate or a similar setup:
C:
void spr = loadsprite("data/bgs/road/tree.png");
setglobalvar("tree_sprite", spr);
Then call it in the loop:
C:
draw_road_item(getglobalvar("tree_sprite"), 500, -1); // Tree at 500m distance, left side
 
Back
Top Bottom