HP Prime for All
English
Русский
| Name | Sinus Ranger |
| Description | A 2D open world game which design is a bit similar to the well known game minecraft. You can explore an infinite world which can be flat or have hills, build with different blocks, dig the ground and shoot enemys. |
| Author | David Traum |
Source code formatted by website engine
BEGIN LOCX := 0;
PX := SW*0.5;
PY := 10;
PVY := 0;
PS := 10;
STATE := 0;
CTY := 0;
CX := SW+40;
CY := 40;
AX := 0;
AY := 0;
RAND := RANDOM() * 0.01;
HP := 100;
SHX := 0;
SHY := 0;
EX := -400;
EY := 30;
EVX := 1;
ESX := 0;
EST := 0;
LASTWATER := FALSE;
CITEM := 0;
BLL := 0;
EQP := 0;
WEATHER := 0;
WETI := 0;
END;
PICKCOLOR()
BEGIN RECT_P(G0, 0, 0, 50, SH, RGB(255, 0, 0));
RECT_P(G0, 50, 0, 100, SH, RGB(0, 255, 0));
RECT_P(G0, 100, 0, 150, SH, RGB(0, 0, 255));
RECT_P(G0, 150, 0, 200, SH, RGB(255, 255, 0));
RECT_P(G0, 200, 0, 250, SH, RGB(0, 255, 255));
RECT_P(G0, 250, 0, 300, SH, RGB(255, 0, 255));
RECT_P(G0, 300, 0, 350, SH, RGB(0, 0, 0));
TEXTOUT_P("Select Color", G0, 100, 20, 7, BLACK);
WHILE 1 == 1 DO WAIT(-1);
IF MOUSE(0) > 0 THEN RETURN GETPIX_P(MOUSE(0), MOUSE(1));
END;
END;
END;
GRASS(LX, LY, GC)
BEGIN RECT_P(GC, LX-5, LY-5, LX+5, LY+5, GROUND);
FOR CO FROM LX-5 TO LX+5 DO LINE_P(GC, CO, LY-5, CO, LY - (RANDOM() * 5), EARTH);
END;
END;
CACTUSBLOCK(LX, LY, GC)
BEGIN RECT_P(G2, LX-5, LY-5, LX+5, LY+5, RGB(0, 150, 0));
FOR I FROM 0 TO 5 DO X := (LX-4) + (RANDOM() * 8);
Y := (LY-4) + (RANDOM() * 8);
RECT_P(G2, X, Y, X+1, Y+1, BLACK);
END;
END;
CACTUS(LX, LY, GC)
BEGIN CACTUSBLOCK(LX, LY, GC);
CACTUSBLOCK(LX, LY-10, GC);
CACTUSBLOCK(LX, LY-20, GC);
//IF RANDOM() > 0.5 THEN
//CACTUSBLOCK(LX, LY-30);
//END;
END;
WOOD(LX, LY, GC)
BEGIN RECT_P(GC, LX-5, LY-5, LX+5, LY+5, RGB(165, 42, 42));
END;
ORE(LX, LY, CLR, GC)
BEGIN RECT_P(GC, LX-5, LY-5, LX+5, LY+5, RGB(80, 80, 80));
FOR I FROM 0 TO 5 DO X := (LX-5) + (RANDOM() * 8);
Y := (LY-5) + (RANDOM() * 8);
RECT_P(GC, X, Y, X+1, Y+1, CLR);
END;
END;
LEAVES(LX, LY, GC)
BEGIN RECT_P(GC, LX-5, LY-5, LX+5, LY+5, SUN_OUTER);
FOR I FROM 0 TO 15 DO PIXON_P(GC, (LX-5) + (RANDOM() * 10), (LY-5) + (RANDOM() * 10), SUN_INNER);
END;
END;
TREE(LX, LY, GC)
BEGIN WOOD(LX, LY, GC);
WOOD(LX, LY-10, GC);
WOOD(LX, LY-20, GC);
WOOD(LX, LY-30, GC);
WOOD(LX, LY-40, GC);
LEAVES(LX, LY-50, GC);
LEAVES(LX-10, LY-40, GC);
LEAVES(LX+10, LY-40, GC);
LEAVES(LX-10, LY-30, GC);
LEAVES(LX-20, LY-30, GC);
LEAVES(LX+10, LY-30, GC);
LEAVES(LX+20, LY-30, GC);
END;
ENEMY(LX, LY, CIN, COUT)
BEGIN RECT_P(G1, LX-PS, LY-PS, LX+PS, LY+PS, COUT, CIN);
PIXON_P(G1, LX-3, LY-3, COUT);
PIXON_P(G1, LX+3, LY-3, COUT);
LINE_P(G1, LX-2, LY+3, LX+2, LY+3, COUT);
RECT_P(G1, LX-PS, LY-5, LX-PS*3, LY+5, COUT, CIN);
RECT_P(G1, LX+PS, LY-5, LX+PS*3, LY+5, COUT, CIN);
END;
DIG(LX, LY, RNG)
BEGIN RECT_P(G2, LX-RNG, LY-RNG, LX+RNG, LY+RNG, BACK);
END;
ENEMYUPDATE()
BEGIN IF EVX > 0 THEN IF EX < SW+100 THEN EX := EX+EVX;
ELSE
EVX := EVX*-1;
EX := EX+EVX;
END;
ELSE
IF EX > -100 THEN EX := EX+EVX;
ELSE
EVX := EVX*-1;
EX := EX+EVX;
END;
END;
IF EX > 0 AND EX < SW THEN EST := EST+1;
IF EST > 250 - (ENM*100) AND ESX == 0 THEN ESX := EX;
ESY := EY;
ESVX := ((PX-LOCX) - EX) * 0.01;
ESVY := (PY-EY) * 0.01;
EST := 0;
END;
END;
IF ESX > 0 THEN ESX := ESX+ESVX;
ESY := ESY+ESVY;
IF √(((PX-LOCX) - ESX)^2) + (PY-ESY)^2 < 40 THEN HP := HP-30;
ESX := 0;
ELSE
IF GETPIX_P(G2, ESX, ESY)≠BACK THEN DIG(ESX, ESY, ENM*4);
ESX := 0;
END;
END;
END;
ENEMY(EX, EY, WHITE, RED);
END;
CLOUD(LX, LY, TY, GC, COL)
BEGIN CASE IF TY < 1 THEN RECT_P(GC, LX-10, LY-10, LX, LY, COL);
RECT_P(GC, LX, LY, LX+40, LY+15, COL);
RECT_P(GC, LX+10, LY-10, LX+30, LY+20, COL);
END;
IF TY > 1 AND TY < 2 THEN RECT_P(GC, LX-15, LY-15, LX, LY+5, COL);
RECT_P(GC, LX, LY, LX+20, LY+10, COL);
RECT_P(GC, LX-10, LY-15, LX, LY+25, COL);
END;
END;
END;
CLOUDUPDATE()
BEGIN CX := CX-0.4;
CLOUD(CX, CY, CTY, G1, WHITE);
IF CX < -40 THEN CTY := RANDOM() * 2;
CY := (RANDOM() * 40) + 20;
CX := SW + (RANDOM() * 100) + 40;
END;
END;
BLOCK(PX, PY, ID, GC)
BEGIN CASE IF ID == 0 THEN GRASS(PX, PY, GC); END;
IF ID == 1 THEN WOOD(PX, PY, GC); END;
IF ID == 2 THEN CACTUSBLOCK(PX, PY, GC); END;
IF ID == 3 THEN ORE(PX, PY, 0, GC); END;
IF ID == 4 THEN ORE(PX, PY, RGB(180, 180, 220), GC); END;
IF ID == 5 THEN ORE(PX, PY, RGB(255, 215, 0), GC); END;
IF ID == 6 THEN LEAVES(PX, PY, GC); END;
END;
END;
RECALC()
BEGIN RECT_P(G2, BACK);
//ARC_P(G2, SW-60, 60, 40, SUN_INNER);
RECT_P(G0, 18, 38, SW-18, 52, BLACK);
//TEXTOUT_P("Generating...", G0, 20, 15, 2, BLACK);
BUFFER := 0;
BUFFER2 := 40 + (RANDOM() * 190);
BUFFER3 := 0;
BUFFER4 := RANDOM() * 40;
IF BLL > 3 THEN BIOME := RANDOM() * 1.5;
BLL := 0;
END;
BLL := BLL+1;
WATER := RANDOM() > 0.5;
IF LASTWATER == TRUE THEN WATER := TRUE;
END;
IF BIOME > 1 AND BIOME < 2 THEN IF LASTWATER == TRUE THEN BIOME := 0.5;
ELSE
WATER := FALSE;
END;
END;
CASE IF BIOME < 1 THEN BIOMEG := GROUND;
BIOMET := EARTH;
END;
IF BIOME > 1 AND BIOME < 2 THEN BIOMEG := SAND;
BIOMET := DARKSAND;
END;
END;
FOR CO FROM 0 TO SW DO HG := SH - (SIN((LOCX+CO) * (0.010+RAND)) + 1.05) * 60;
LINE_P(G2, CO, SH, CO, HG, BIOMEG);
LINE_P(G2, CO, HG - (RANDOM() * 5), CO, HG + (RANDOM() * 10), BIOMET);
RECT_P(G0, 20, 40, 20 + ((CO/SW) * (SW-40)), 50, GREEN);
IF BUFFER > BUFFER2 AND HG < 200 THEN CASE IF BIOME < 1 THEN TREE(CO, HG, G2); END;
IF BIOME > 1 AND BIOME < 2 THEN CACTUS(CO, HG, G2); END;
END;
BUFFER := 0;
END;
IF WATER == TRUE AND HG > 200 THEN LINE_P(G2, CO, 200, CO, HG, RGB(0, 0, 255));
END;
IF BUFFER3 > BUFFER4 THEN IF RANDOM() > 0.5 THEN ORE(CO, SH - (RANDOM() * (SH-HG-20)), RGB(180, 180, 220), G2);
ELSE
ORE(CO, SH - (RANDOM() * (SH-HG-20)), RGB(255, 215, 0), G2);
END;
BUFFER3 := 0;
BUFFER4 := RANDOM() * 40;
END;
BUFFER := BUFFER+1;
BUFFER3 := BUFFER3+1;
END;
IF WATER == TRUE AND HG > 200 THEN LASTWATER := TRUE;
ELSE
LASTWATER := FALSE;
END;
END;
RENDER()
BEGIN BLIT_P(G1, G2);
RECT_P(G1, SW-60, 20, SW-20, 60, SUN_OUTER, SUN_INNER);
CLOUDUPDATE();
IF STATE≠0 AND ENM > 1 THEN ENEMYUPDATE(); END;
RECT_P(G1, PX-PS-LOCX, PY-PS, PX+PS-LOCX, PY+PS + (PVY*2), OUTLINE, PLAYER);
PIXON_P(G1, PX-3-LOCX, PY-3, OUTLINE);
PIXON_P(G1, PX+3-LOCX, PY-3, OUTLINE);
LINE_P(G1, PX-2-LOCX, PY+3, PX+2-LOCX, PY+3, OUTLINE);
IF WEATHER == 1 THEN BLIT_P(G1, 0, 0, SW, SH, G3, 0, RY, SW, RY+SH, 0);
RY := RY-2;
IF RY < 0 THEN RY := SH*9;
END;
END;
IF STATE == 0 THEN TEXTOUT_P("SinusRanger", G1, 100, 50, 7, OUTLINE);
TEXTOUT_P("Press ENTER to start!", G1, 100, 90, 2, OUTLINE);
TEXTOUT_P("© David Traum (david-traum.com)", G1, 5, SH-15, 1, WHITE);
ELSE
//TEXTOUT_P(PX+"/"+PY+"/"+LOCX, G1, 5, 5, 1, BLACK);
//RECT_P(G1, 50, 200, 250, 230, WHITE);
END;
IF SHX > 0 THEN RECT_P(G1, SHX-2, SHY-2, SHX+2, SHY+2, BLACK);
END;
IF ESX > 0 THEN RECT_P(G1, ESX-2, ESY-2, ESX+2, ESY+2, RED);
END;
IF AX > 0 THEN LINE_P(G1, AX-15, AY-15, AX-5, AY-5, AIM);
LINE_P(G1, AX+15, AY+15, AX+5, AY+5, AIM);
LINE_P(G1, AX+15, AY-15, AX+5, AY-5, AIM);
LINE_P(G1, AX-15, AY+15, AX-5, AY+5, AIM);
END;
RECT_P(G1, 0, 0, SW, 15, OUTLINE);
LINE_P(G1, 0, 15, SW, 15, WHITE);
TEXTOUT_P(HP+"% SinusRanger @ HP-Prime © David Traum", G1, 5, 2, 1, WHITE);
BLOCK(45, 5, EQP, G1);
BLIT_P(G0, G1);
END;
UPDATE()
BEGIN WETI := WETI+1;
IF WETI > 2000 THEN WEATHER := WEATHER+1;
IF WEATHER > 1 THEN WEATHER := 0;
END;
CASE IF WEATHER == 1 THEN RY := SH*10; END;
END;
WETI := 0;
END;
PY := PY+PVY;
IF GETPIX_P(G2, PX-LOCX, PY+PS) == BACK THEN PVY := PVY+0.1;
ELSE
IF PVY > 3.7 THEN HP := HP - (PVY-3.5);
END;
PVY := 0;
RETURN true;
END;
IF GETPIX_P(G2, PX-LOCX, PY)≠BACK THEN PY := PY+10;
END;
RETURN false;
END;
UPDATESHOT()
BEGIN IF SHX > 0 THEN SVY := SVY+0.03;
SHX := SHX+SVX;
SHY := SHY+SVY;
IF GETPIX_P(G2, SHX, SHY)≠BACK THEN DIG(SHX, SHY, 5);
SHX := 0;
END;
IF √((EX-SHX)^2) + ((EY-SHY)^2) < 40 THEN EX := -1000;
ESX := 0;
SHX := 0;
END;
END;
END;
MOVE(DR)
BEGIN IF STATE≠1 THEN RETURN;
END;
BUFFER := GETPIX_P(G2, (PX-LOCX) + DR, PY+PS);
IF BUFFER≠BACK THEN IF BUFFER≠#FFh THEN PY := PY-2;
ELSE
PX := PX-DR*0.5;
RETURN;
END;
ELSE
PX := PX-DR;
END;
END;
REL(KC)
BEGIN WHILE ISKEYDOWN(KC) DO WAIT(0.01); END; END;
EXPORT SinusRanger()
BEGIN PRINT();
PRINT("Preparing memory...");
DIMGROB_P(G1, SW, SH);
DIMGROB_P(G2, SW, SH);
DIMGROB_P(G3, SW, SH*10);
RESET();
PRINT("Generating resources...");
RECT_P(G3, 0, 0, SW, SH*10, RGB(0, 0, 0));
FOR BUFFER FROM 0 TO 5000 DO PIXON_P(G3, RANDOM() * SW, RANDOM() * SH*10, RGB(0, 0, 255));
END;
CHOOSE(BUFFER, "Menu", {"Run Game", "How to play", "Clear Memory"});
IF BUFFER == 2 THEN PRINT();
PRINT("SinusRanger - How to play");
PRINT("");
PRINT(" Move: Wheel Left/Right");
PRINT(" Dive: Wheel Up/Down");
PRINT(" Jump: Enter");
PRINT(" Switch Build/Destroy: +");
PRINT(" Build/Destroy: _");
PRINT(" Shoot: .");
PRINT(" Aim: Touchscreen");
PRINT(" Reset: Delete");
PRINT(" Change Block: , ");
PRINT(" New Chunk: Plot");
PRINT("");
PRINT("Version: 1.2");
RETURN;
END;
IF BUFFER == 3 THEN MSGBOX("Restart reqired");
DIMGROB_P(G9, 999999, 999999);
RETURN;
END;
CHOOSE(ENM, "Difficulty", {"Peaceful", "Normal", "Hard"});
PLAYER := PICKCOLOR();
RECALC();
WHILE NOT ISKEYDOWN(4) DO RENDER();
UPDATE();
UPDATESHOT();
IF ISKEYDOWN(8) THEN MOVE(-2);
END;
IF ISKEYDOWN(7) THEN MOVE(2);
END;
IF ISKEYDOWN(30) THEN IF GETPIX_P(G2, PX-LOCX, PY+PS)≠BACK THEN STATE := 1;
PVY := -3.5;
END;
END;
IF PX > SW+LOCX THEN LOCX := LOCX + (SW-30);
RECALC();
END;
IF ISKEYDOWN(29) THEN EQP := EQP+1;
IF EQP > 6 THEN EQP := 0; END;
REL(29);
END;
IF ISKEYDOWN(6) THEN RECALC();
END;
IF ISKEYDOWN(49) THEN IF AIM == GREEN THEN BLOCK(AX, AY, EQP, G2);
ELSE
DIG(AX, AY, 5);
END;
END;
IF ISKEYDOWN(50) THEN IF AIM == GREEN THEN AIM := RED;
ELSE
AIM := GREEN;
END;
REL(50);
END;
IF PX-LOCX < 0 THEN LOCX := LOCX - (SW-30);
RECALC();
END;
IF MOUSE(0) > 0 THEN AX := MOUSE(0);
AY := MOUSE(1);
END;
IF ISKEYDOWN(19) THEN RESET();
RECALC();
END;
IF ISKEYDOWN(33) THEN AY := AY-10;
REL(33);
END;
IF ISKEYDOWN(37) THEN AX := AX-10;
REL(37);
END;
IF ISKEYDOWN(39) THEN AX := AX+10;
REL(39);
END;
IF ISKEYDOWN(43) THEN AY := AY+10;
REL(43);
END;
IF ISKEYDOWN(48) AND AX > 0 AND SHX == 0 THEN SHX := PX-LOCX;
SHY := PY;
SVX := (AX - (PX-LOCX)) * 0.02;
SVY := (AY-PY) * 0.02;
END;
IF HP < 100 THEN HP := HP+0.01;
END;
IF HP < 0 THEN RESET();
RECALC();
END;
IF ISKEYDOWN(12) THEN IF GETPIX_P(G2, (PX-LOCX), PY+PS+2) == #FFh THEN PY := PY+1;
END;
END;
IF ISKEYDOWN(2) THEN IF GETPIX_P(G2, (PX-LOCX), PY+PS+1) == #FFh THEN PY := PY-1;
END;
END;
END;
END;