This commit is contained in:
Victor 2018-11-15 12:34:18 +02:00
commit f3f1245a95
93 changed files with 6518 additions and 0 deletions

83
build.xml Normal file
View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<project name="JavaMania" default="jar" basedir=".">
<description>Builds, tests, and runs the project .</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
pre-init: called before initialization of project properties
post-init: called after initialization of project properties
pre-preprocess: called before text preprocessing of sources
post-preprocess: called after text preprocessing of sources
pre-compile: called before source compilation
post-compile: called after source compilation
pre-obfuscate: called before obfuscation
post-obfuscate: called after obfuscation
pre-preverify: called before preverification
post-preverify: called after preverification
pre-jar: called before jar building
post-jar: called after jar building
pre-build: called before final distribution building
post-build: called after final distribution building
pre-clean: called before cleaning build products
post-clean: called after cleaning build products
Example of pluging a my-special-task after the compilation could look like
<target name="post-compile">
<my-special-task>
<fileset dir="${build.classes.dir}"/>
</my-special-task>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Other way how to customize the build is by overriding existing main targets.
The target of interest are:
preprocess: preprocessing
extract-libs: extraction of libraries and resources
compile: compilation
create-jad: construction of jad and jar manifest source
obfuscate: obfuscation
preverify: preverification
jar: jar archive building
run: execution
debug: execution in debug mode
build: building of the final distribution
javadoc: javadoc generation
Example of overriding the target for project execution could look like
<target name="run" depends="init,jar">
<my-special-exec jadfile="${dist.dir}/${dist.jad}"/>
</target>
Be careful about correct dependencies when overriding original target.
Again, for list of available properties which you can use check the target
you are overriding in nbproject/build-impl.xml file.
A special target for-all-configs can be used to run some specific targets for
all project configurations in a sequence. File nbproject/build-impl.xml
already contains some "for-all" targets:
jar-all
javadoc-all
clean-all
Example of definition of target iterating over all project configurations:
<target name="jar-all">
<property name="target.to.call" value="jar"/>
<antcall target="for-all-configs"/>
</target>
-->
</project>

1368
nbproject/build-impl.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
build.xml.data.CRC32=18e7e3b5
build.xml.script.CRC32=a7ca5983
build.xml.stylesheet.CRC32=03eab09b
nbproject/build-impl.xml.data.CRC32=18e7e3b5
nbproject/build-impl.xml.script.CRC32=a910d65a
nbproject/build-impl.xml.stylesheet.CRC32=d670562e

View File

@ -0,0 +1,7 @@
#Thu Sep 17 22:43:08 EEST 2009
netbeans.user=D\:\\Users\\aNNiMON\\.netbeans\\6.7
javadoc.preview=true
config.active=
deployment.counter=12
app-version.autoincrement=true
deployment.number=0.0.11

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
</project-private>

View File

@ -0,0 +1,140 @@
abilities=MMAPI=1.1,SATSAJCRMI=1.0,SATSACRYPTO=1.0,lib/jsr256.jar=1.0,JSR82=1.1,JSR226=1.0,MIDP=2.0,JSR229=1.1.0,SATSAAPDU=1.0,CLDC=1.1,JSR177=1.0,JSR179=1.0.1,J2MEWS=1.0,WMA=2.0,JSR172=1.0,ColorScreen,OBEX=1.0,JSR238=1.0,JSR211=1.0,JSR234=1.0,lib/midpapi21.jar=1.0,JSR75=1.0,JSR184=1.1,SATSAPKI=1.0,ScreenHeight=225,ScreenColorDepth=8,JSR180=1.1.0,J2MEXMLRPC=1.0,
all.configurations=\
application.args=
application.description=
application.description.detail=
application.name=
application.vendor=Vendor
build.classes.dir=${build.dir}/compiled
build.classes.excludes=**/*.java,**/*.form,**/*.class,**/.nbintdb,**/*.mvd,**/*.wsclient,**/*.vmd
build.dir=build/${config.active}
build.root.dir=build
debug.level=debug
deployment.copy.target=deploy
deployment.instance=default
deployment.jarurl=${dist.jar}
deployment.method=NONE
deployment.override.jarurl=false
dist.dir=dist/${config.active}
dist.jad=JavaMANia.jad
dist.jar=JavaMANia.jar
dist.javadoc.dir=${dist.dir}/doc
dist.root.dir=dist
extra.classpath=
filter.exclude.tests=false
filter.excludes=
filter.more.excludes=**/overview.html,**/package.html
filter.use.standard=true
jar.compress=true
javac.debug=true
javac.deprecation=false
javac.encoding=UTF-8
javac.optimize=false
javac.source=1.3
javac.target=1.3
javadoc.author=false
javadoc.encoding=
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
libs.classpath=
main.class=
main.class.class=applet
manifest.apipermissions=
manifest.file=manifest.mf
manifest.jad=
manifest.manifest=
manifest.midlets=MIDlet-1: JavaM@Nia,/res/icon.png,JM\n
manifest.others=MIDlet-Vendor: aNNiMON\nMIDlet-Name: JavaM@Nia\nMIDlet-Version: 1.1\n
manifest.pushregistry=
name=aNMPWR
no.dependencies=false
nokiaS80.application.icon=
nsicom.application.monitorhost=
nsicom.application.runremote=
nsicom.application.runverbose=
nsicom.remoteapp.location=\\My Documents\\NetBeans Applications
nsicom.remotevm.location=\\Windows\\creme\\bin\\CrEme.exe
obfuscated.classes.dir=${build.dir}/obfuscated
obfuscation.custom=-keep public class * extends javax.microedition.midlet.MIDlet\n-keepnames class **Exception\n\n-optimizationpasses 9\n-overloadaggressively\n-dontusemixedcaseclassnames\n-repackageclasses ''\n-allowaccessmodification\n-microedition
obfuscation.level=9
obfuscator.destjar=${build.dir}/obfuscated.jar
obfuscator.srcjar=${build.dir}/before-obfuscation.jar
platform.active=Sony_Ericsson_SDK_2_5_0_4_for_the_Java_TM__ME_Platform_Emulator_
platform.active.description=Sony Ericsson SDK 2.5.0.4 for the Java(TM) ME Platform(Emulator)
platform.apis=JSR234-1.0,JSR211-1.0,JSR75-1.0,J2ME-WS-1.0,JSR82-1.1,JSR184-1.1,JSR238-1.0,MMAPI-1.1,JSR226-1.0,WMA-2.0
platform.bootclasspath=${platform.home}/lib/jsr226.jar:${platform.home}/lib/jsr238.jar:${platform.home}/lib/jsr211.jar:${platform.home}/lib/jsr082.jar:${platform.home}/lib/jsr184.jar:${platform.home}/lib/jsr75.jar:${platform.home}/lib/mmapi.jar:${platform.home}/lib/j2me-ws.jar:${platform.home}/lib/wma20.jar:${platform.home}/lib/jsr234.jar:${platform.home}/lib/cldcapi10.jar:${platform.home}/lib/midpapi20.jar
platform.configuration=CLDC-1.0
platform.device=SonyEricsson_JP8_240x320_Emu
platform.fat.jar=true
platform.profile=MIDP-2.0
platform.trigger=CLDC
platform.type=UEI-1.0.1
preprocessed.dir=${build.dir}/preprocessed
preverify.classes.dir=${build.dir}/preverified
preverify.sources.dir=${build.dir}/preverifysrc
resources.dir=resources
ricoh.application.email=
ricoh.application.fax=
ricoh.application.icon=
ricoh.application.target-jar=
ricoh.application.telephone=
ricoh.application.uid=91211980
ricoh.application.version=
ricoh.dalp.application-desc.auto-run=false
ricoh.dalp.application-desc.energy-save=
ricoh.dalp.application-desc.exec-auth=
ricoh.dalp.application-desc.visible=true
ricoh.dalp.argument=
ricoh.dalp.codebase=
ricoh.dalp.display-mode.color=true
ricoh.dalp.display-mode.is-4line-support=false
ricoh.dalp.display-mode.is-hvga-support=true
ricoh.dalp.display-mode.is-vga-support=false
ricoh.dalp.display-mode.is-wvga-support=false
ricoh.dalp.information.abbreviation=
ricoh.dalp.information.icon.basepath=
ricoh.dalp.information.icon.location=
ricoh.dalp.information.is-icon-used=true
ricoh.dalp.install.destination=hdd
ricoh.dalp.install.mode.auto=true
ricoh.dalp.install.work-dir=hdd
ricoh.dalp.is-managed=true
ricoh.dalp.resources.dsdk.version=2.0
ricoh.dalp.resources.jar.basepath=
ricoh.dalp.resources.jar.version=
ricoh.dalp.version=
ricoh.icon.invert=false
ricoh.platform.target.version=
run.cmd.options=
run.jvmargs=
run.method=STANDARD
run.security.domain=trusted
run.use.security.domain=false
savaje.application.icon=
savaje.application.icon.focused=
savaje.application.icon.small=
savaje.application.uid=TBD
savaje.bundle.base=
savaje.bundle.debug=false
savaje.bundle.debug.port=
semc.application.caps=
semc.application.icon=
semc.application.icon.count=
semc.application.icon.splash=
semc.application.icon.splash.installonly=false
semc.application.uid=E3524877
semc.certificate.path=
semc.private.key.password=
semc.private.key.path=
sign.alias=
sign.enabled=false
sign.keystore=
src.dir=src
use.emptyapis=true
use.preprocessor=true

10
nbproject/project.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.kjava.j2meproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2me-project">
<name>JavaMania</name>
<minimum-ant-version>1.6</minimum-ant-version>
</data>
</configuration>
</project>

55
src/Effects.java Normal file
View File

@ -0,0 +1,55 @@
import javax.microedition.lcdui.*;
/**
*
* @author aNNiMON
*/
public class Effects {
public static Image effect(Image img) {
int[] pixel = new int[img.getWidth() * img.getHeight()];
img.getRGB(pixel, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
for (int io = 0; io < pixel.length; io++) {
int qa = (pixel[io] >> 24) & 0xff;
int qr = (pixel[io] >> 16) & 0xff;
int qg = (pixel[io] >> 8) & 0xff;
int qb = pixel[io] & 0xff;
qr += UI.osv;if(qr>255) qr=255;if(qr<0) qr=0;
qg += UI.osv;if(qg>255) qg=255;if(qg<0) qg=0;
qb += UI.osv;if(qb>255) qb=255;if(qb<0) qb=0;
pixel[io] = (qa << 24) | (qr << 16) | (qg << 8) | qb;
}
return Image.createRGBImage(pixel, img.getWidth(), img.getHeight(), true);
}
public static Image Resize(Image temp, int newX, int newY)
{
newX=Math.abs(newX)+1; newY=Math.abs(newY)+1;
int rgb[] = new int[temp.getWidth() * temp.getHeight()];
temp.getRGB(rgb, 0, temp.getWidth(), 0, 0, temp.getWidth(), temp.getHeight());
int rgb2[] = rescaleArray(rgb, temp.getWidth(), temp.getHeight(), newX, newY);
Image temp2 = Image.createRGBImage(rgb2, newX, newY, true);
return temp2;
}
private static int[] rescaleArray(int ini[], int x, int y, int x2, int y2) {
int out[] = new int[x2 * y2];
for(int yy = 0; yy < y2; yy++) {
int dy = (yy * y) / y2;
for(int xx = 0; xx < x2; xx++) {
int dx = (xx * x) / x2;
out[x2 * yy + xx] = ini[x * dy + dx];
}
}
return out;
}
public static int acolor(int argb, char c) {
if(c=='a') return ((argb >> 24) & 0xff);
else if(c=='r') return ((argb >> 16) & 0xff);
else if(c=='g') return ((argb >> 8) & 0xff);
else if(c=='b') return (argb & 0xff);
else return argb;
}
}

45
src/FWCashe.java Normal file
View File

@ -0,0 +1,45 @@
import javax.microedition.lcdui.Font;
import java.util.Vector;
public class FWCashe
{
protected static Vector fwc = new Vector ();
protected static Vector fwc_f = new Vector ();
public static FWCashe getCache (Font font)
{
for (int i = 0; i < fwc.size (); i++)
if (fwc_f.elementAt(i).equals (font))
return (FWCashe)fwc.elementAt(i);
fwc_f.addElement (font);
FWCashe f;
fwc.addElement (f = new FWCashe (font));
return f;
}
protected Font font;
protected byte caches [][];
protected FWCashe (Font font)
{
this.font = font;
caches = new byte [256][];
for (int i = 0; i < 256; i++)
caches [i] = null;
}
public int charWidth (char ch)
{
int hi = (ch >> 8)&0xFF, lo = (ch)&0xFF;
if (caches [hi] == null)
{
caches [hi] = new byte [256];
for (int i = 0; i < 256; i++)
caches [hi][i] = -1;
}
if (caches [hi][lo] == -1)
caches [hi][lo] = (byte)font.charWidth (ch);
return caches [hi][lo];
}
}

33
src/JM.java Normal file
View File

@ -0,0 +1,33 @@
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* @author aNNiMON
*/
public class JM extends MIDlet {
public Display dsp;
public static JM midlet;
public static String name;
public Loading cnv;
public JM () {
midlet = this;
}
public void startApp() {
cnv = new Loading();
cnv.setFullScreenMode(true);
name="JavaM@Nia";
Util.getUI("/xml/skin.ini");
dsp = Display.getDisplay(this);
dsp.setCurrent(cnv);
}
public void pauseApp() {
}
public void destroyApp(boolean un) {
notifyDestroyed();
}
}

75
src/Key.java Normal file
View File

@ -0,0 +1,75 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author sinaz
*/
public class Key {
public static String Platform = "";//можно убрать если не нужно
public static int leftSoftKey = -6;//ALL Devices
public static int rightSoftKey = -7;//ALL Devices
public static int Call = - 1000;// Samsung Z500 & Siemens Devices
public static int Hangup = - 1000;//Siemens Devices (S-Gold)
public static int Back = -1000;//SonyEricsson
//Only SonyEricsson JP6
public static int VolPlus = -1000;
public static int VolMinus = -1000;
public static int Camera = -1000;
public static int Focus = -1000;
public static int Snapshot = -1000;
//*************************
static {
String microeditionPlatform = System.getProperty("microedition.platform");
if (microeditionPlatform != null) {
String melc = microeditionPlatform.toLowerCase();
if (melc.indexOf("ericsson") != -1)//SonyEricsson
{
Back = -11;
//Only SonyEricsson JP6
VolPlus = -36;
VolMinus = -37;
Camera = -24;
Focus = -25;
Snapshot = -26;
Platform = "Sony Ericsson";
} else if (melc.indexOf("nokia") != -1)//Nokia Devices (S40) (S60)
{
//Only Nokia Devices (S60)
Platform = "Nokia";
} else {//остальные не выдают фирму,а только марку мобилы например Z500,потому их лучше ловить по классам
try {
Class.forName("com.samsung.util.Vibration");//Samsung
Call = -5;// Samsung Z500
Platform = "Samsung";
} catch (Throwable t0) {
try {
Class.forName("com.siemens.mp.io.file.FileConnection");//Siemens Devices (S-Gold)
leftSoftKey = -1;
rightSoftKey = -4;
Call = -11;
Hangup = -12;
Camera = -20;
Platform = "Siemens";
} catch (Throwable t1) {
try {
Class.forName("com.motorola.io.file.FileConnection");
leftSoftKey = -21;
rightSoftKey = -22;
Call = -10;
//Motorola V300, V500, V525 должны быть софты leftSoftKey = 21;rightSoftKey = 22;
Platform = "Motorola";
} catch (Throwable t2) { //сюда можно вписать ешё платформу мотороллы с классом com.motorola.io.FileConnection
//но у неё файловая мудацкая
}
}
}
}
}
}
}

65
src/Loading.java Normal file
View File

@ -0,0 +1,65 @@
import javax.microedition.lcdui.*;
/**
* @author aNNiMON
*/
public class Loading extends Canvas implements Runnable {
private int w,h, sleep;
private byte mode;
private Thread thr;
private Image logo1, logo2;
private long lt;
private volatile boolean slp;
public Loading() {
setFullScreenMode(true);
slp = true;
w = getWidth();
h = getHeight();
mode=-1; sleep=3000;
try {
logo1 = Image.createImage("/res/logo1.png");
if(w==240 && h==320) {
logo2 = Image.createImage("/res/logo2.png");
}else{
logo2 = Effects.Resize(Image.createImage("/res/logo2.png"), w, w*320/240);
}
} catch (Exception ex) {
ex.printStackTrace();
}
thr = new Thread(this);
thr.start();
}
public final void paint(Graphics g) {
g.setColor(0xffffff);
g.fillRect(0,0,w,h);
switch(mode) {
case 0: g.drawImage(logo1, w/2, h/2, 3); break;
case 1: g.drawImage(logo2, w/2, h/2, 3); break;
case 2: System.gc(); slp = false; Menu mn = new Menu(Effects.effect(logo2)); JM.midlet.dsp.setCurrent(mn); break;
}
lt = System.currentTimeMillis();
}
public final void keyPressed(int key) {
if(getGameAction(key)==FIRE) {
lt = System.currentTimeMillis();
mode++;
repaint();
}
}
public void run() {
while(true) {
if(!slp) break;
if(System.currentTimeMillis()-lt>sleep) {
mode++;
lt = System.currentTimeMillis();
repaint();
}
}
}
}

137
src/Menu.java Normal file
View File

@ -0,0 +1,137 @@
import javax.microedition.lcdui.*;
/**
* @author aNNiMON
*/
public class Menu extends Canvas {
private int w,h;
private String[] menu;
private Image back;
private int FileY;
private int fh, ah;
private int cu=0;
private long ty;
public Menu(Image img) {
setFullScreenMode(true);
w = getWidth();
h = getHeight();
back=img;
menu = new String[] {
JM.name,
"Новости",
"Помощь",
"О нас",
"Выход"
};
fh = UI.stFont.getHeight();
ah = fh*menu.length;
}
public void paint(Graphics g) {
g.drawImage(back, w/2, h/2, 3);
drawMenu(g, menu);
UI.drawMenuInterface(g,JM.name,"Выбор","Выход");
}
private void getCursor(int cu) {
if(cu==0) JM.midlet.dsp.setCurrent(new aNMPWR(back));
if(cu==1) {
TextView tv = new TextView(back);
tv.openFile("http://java-mania.ru/magazin/news.txt", this, menu[cu]);
}
if(cu==2) {
TextView tv = new TextView(back);
tv.openFile("/txt/help.txt", this, menu[cu]);
}
if(cu==3) {
TextView tv = new TextView(back);
tv.openFile("/txt/about.txt", this, menu[cu]);
}
if(cu==4) JM.midlet.destroyApp(true);
}
public void keyPressed(int key) {
int ga;
try {
ga = getGameAction(key);
} catch (Exception e) {
ga = 0;
}
if(ga==UP || ga==LEFT) {cu--;if(cu<0) cu=menu.length-1;}
if(ga==DOWN || ga==RIGHT) {cu++;if(cu>menu.length-1) cu=0;}
if(key==Key.rightSoftKey) JM.midlet.destroyApp(true);
if(key==Key.leftSoftKey || ga==FIRE) {
getCursor(cu);
}
repaint();
}
protected void pointerPressed(int pix, int piy) {
int q = UI.getSoftBarHeight();
if(pix<2*q && piy>h-q) {
getCursor(cu);
}else if(pix>w-2*q && piy>h-q) {
JM.midlet.destroyApp(true);
}else{
int cu1=cu;
piy-=(h/2-ah/2);
if(piy>0 && piy<menu.length*fh) {
cu=piy/fh;
}
if(System.currentTimeMillis()-ty<700 && cu1==cu) getCursor(cu);
ty = System.currentTimeMillis();
repaint();
}
}
public void keyRepeated(int key) {
keyPressed(key);
}
private void drawCursor(Graphics g) {
/*int r1=249, r2=214,
g1=250, g2=217,
b1=251, b2=223;*/
int r1=Effects.acolor(UI.curcol1, 'r');int r2=Effects.acolor(UI.curcol2, 'r');
int g1=Effects.acolor(UI.curcol1, 'g');int g2=Effects.acolor(UI.curcol2, 'g');
int b1=Effects.acolor(UI.curcol1, 'b');int b2=Effects.acolor(UI.curcol2, 'b');
int pr,pg,pb;
int yn=0;
int curw = UI.bstFont.stringWidth(menu[cu])+1;
for(int i=0; i<fh; i++) {
for(int j=curw; j<curw+fh/2; j++) {
pr=r1 + (((i - fh) + 1) * (r2 - r1)) / (fh - yn - 1) + (r2 - r1);
pg=g1 + (((i - fh) + 1) * (g2 - g1)) / (fh - yn - 1) + (g2 - g1);
pb=b1 + (((i - fh) + 1) * (b2 - b1)) / (fh - yn - 1) + (b2 - b1);
int prgb=(pr+pg+pb)/3;
g.setColor(prgb, prgb, prgb);
g.drawLine(0, (h/2-ah/2)+FileY+1+i, w, (h/2-ah/2)+FileY+1+i);
g.setColor(pr, pg, pb);
g.drawLine(w/2-j/2-i, (h/2-ah/2)+FileY+1+i, w/2+j/2+i, (h/2-ah/2)+FileY+1+i);
}
}
}
private void drawMenu(Graphics g, String[] stmenu) {
FileY = 0;
for (int i = 0; i < stmenu.length; i++) {
if (FileY == cu*fh) {
drawCursor(g);
g.setColor(UI.shadow);
g.setFont(UI.bstFont);
g.drawString(stmenu[i], w/2, (h/2-ah/2)+FileY+1, 17);
FileY += fh;
continue;
}
g.setFont(UI.stFont);
g.setColor(UI.textnc);
g.drawString(stmenu[i], w/2, (h/2-ah/2)+FileY, 17);
FileY += fh;
}
}
}

673
src/TextView.java Normal file
View File

@ -0,0 +1,673 @@
//import com.sun.midp.FtpMid.Main;
import com.vmx.*;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
/**
* @author aNNiMON
*/
public class TextView extends Canvas {
public Displayable parent;
// Чтение и запись текста
private BufDataInputStream bdis = null;
private InputStreamDecoder isd = null;
private static int BUFSIZE = 2048;
private String enc = null;
private int scrStart, scrEnd;
private int fntTextc = 1;
// Отрисовка текста и заголовок
private String caption;
private int linesPerScreen;
private int w, h, dry;
private Font fntText;
private int fntTextHeight;
private FWCashe fch;
private String lines[];
private int lineposes[];
private boolean wordWrapGlobal = true;
// Полноэкранный режим
private Image back;
private boolean fsmode;
private int header, footer;
private String filename;
private boolean read;
private int fore = 0x000080;
private int maxnumFont = 6;
private boolean showimage = true;
/**
* Конструктор
*/
public TextView(Image img) {
setFullScreenMode(true);
w = getWidth();
h = getHeight();
back=img;
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
fntTextHeight = fntText.getHeight();
fch = FWCashe.getCache(fntText);
linesPerScreen = (h - 2*UI.getSoftBarHeight()) / fntText.getHeight() - 1;
lines = new String[linesPerScreen];
lineposes = new int[linesPerScreen + 1];
// инициализация переменных i/o
bdis = null;
isd = null;
// фулл/не фулл скрин
fsmode = true;
setFSMode(false);
}
private void init() {
fntTextHeight = fntText.getHeight();
fch = FWCashe.getCache(fntText);
linesPerScreen = (h - 2*UI.getSoftBarHeight()) / fntText.getHeight() - 1;
lines = new String[linesPerScreen];
lineposes = new int[linesPerScreen + 1];
// фулл/не фулл скрин
fsmode = true;
setFSMode(false);
}
/**
* Установить полноэкранный/не полноэкранный режим
*/
private void setFSMode(boolean nm) {
if (fsmode != nm) {
fsmode = nm;
if (!fsmode) {
header = UI.getSoftBarHeight();
footer = UI.getSoftBarHeight();
} else {
header = footer = 0;
}
linesPerScreen = (h - header - footer - 2) / fntText.getHeight() - 1;
lines = new String[linesPerScreen];
lineposes = new int[linesPerScreen + 1];
if (bdis != null) {
try {
bdis.seek(scrStart);
readScreen(wordWrapGlobal);
} catch (Exception x) {
}
}
repaint();
}
}
/**
* Открыть входной поток с использованием дополнительных процедур
*/
private boolean openStream(InputStream is, String enc2, boolean read) {
this.read = read;
clearScreen();
if (bdis != null) {
bdis = null;
}
try {
bdis = new BufDataInputStream(BUFSIZE, is, read);
if (enc2 == null) { // Если название кодировки null то значит открывается файл из ФС,распознаём его кодировку
detectEncoding();
enc2 = enc;
}
enc = enc2;
isd = new InputStreamDecoder(bdis, enc2);
if (is != null)
{
readScreen(wordWrapGlobal);
repaint();
}
JM.midlet.dsp.setCurrent(this);
} catch (Exception iox) {
iox.printStackTrace();
return false;
}
return true;
}
/**
* Осознать, в какой кодировке файл, записать кодировку в enc,
*/
private int detectEncoding() throws IOException {
enc = "windows-1251";
int pos = 0;
// is.mark (10);
if (bdis.buffer[0] == -17 && // 0xEF
bdis.buffer[1] == -69 && // 0xBB
bdis.buffer[2] == -65) // 0xBF
{
enc = "UTF-8";
pos = 3;
} else // Если нет сигнатуры то проверяем соответствуюшим методом UTFrider()
if (UTFrider() | caption.endsWith("class"))// или если открыт *.class то так-же читаем в кодировке UTF
{
enc = "UTF-8";
}
return pos;
}
/**
* Метод ишет русские буквы "АЕИЙОУЭЮЯаеийоуэюя" и возврашяет true если есть хоть одна
*
*/
private boolean UTFrider() {
// System.out.println("UTFrider");
if (bdis.available() <= 0) {
return false;
}
String utf = "АЕИЙОУЭЮЯаеийоуэюя";
int bukva = 0;
for (int i = 0; i < utf.length(); i++) {
try {
if (bdis.poisk(StringEncoder.encodeString("" + utf.charAt(i), "UTF-8"))) {
bukva++;
}
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
bdis.bpos = 0;
}
if (bukva != 0) {
return true;
} else {
return false;
}
}
/**
* Открыть файл со всеми возможностями
*/
public void openFile(final String file, Displayable parent, String title) {
this.filename = file;
this.parent = parent;
caption = title;
new Thread(new Runnable() {
public void run() {
try {
InputStream is = null;
if(file.toLowerCase().startsWith("http://")) {
HttpConnection hc;
(hc = (HttpConnection) Connector.open(file.replace('^', '-'))).getResponseCode();
is = hc.openInputStream();
}else{
is = JM.midlet.getClass().getResourceAsStream(file);
}
openStream(is, null, false);
} catch (Exception x) {
System.out.println("Exception with message: " + x.getMessage());
x.printStackTrace();
}
}
}).start();
}
/**
* Закрыть входной поток, и если closer != null => вызвать closer.close();
*/
public void closeStream() {
if (bdis != null) {
try {
bdis.close();
} catch (IOException iox) {
iox.printStackTrace();
}
bdis = null;
}
if (parent != null) { // System.out.println("parent");
JM.midlet.dsp.setCurrent(parent);
parent = null;
} else {
JM.midlet.dsp.setCurrent(new aNMPWR(back));
}
}
/**
* Прочитать строку из потока
*/
public String readString(boolean wordWrap) {
String s = "";
int maxStrWidth = w - 7;
char c = '0', cmin1 = (char) -1;
int afterspace = -1, cut = 0;
int strwidth = 0;
try {
if (bdis == null || bdis.available() <= 0) {
return null;
}
do {
c = isd.readChar(); //System.out.println("c= "+c);
if (c != cmin1 && c != '\r') {
s += c;
strwidth += fch.charWidth(c);
}
if ((c == cmin1) || (c == '\n')) // новая строка или конец файла
{
wordWrap = false;
break;
}
if (c == ' ') {
afterspace = 0;
} else if (afterspace >= 0) {
afterspace++;
}
} while (strwidth < maxStrWidth);
if (wordWrap && afterspace >= 0) {
cut += afterspace;
} else if (strwidth > maxStrWidth && c != ' ') {
cut = 1;
}
if (cut > 0) {
s = s.substring(0, s.length() - cut);
if (enc.compareTo("UTF-8") != 0) {
bdis.seek(bdis.tell() - cut);
} else {
for (int i = 0; i < cut; i++) {
isd.readCharBack();
}
}
}
} catch (IOException iox) {
return null;
}
return s;
}
/**
* Прочитать строку из потока НАЗАД
*/
public String readStringBack(boolean wordWrap) {
String s = "";
int maxStrWidth = w - 7;
char c = '0', cmin1 = (char) -1;
int afterspace = -1;
int cut = 0;
int strwidth = 0;
try {
if (bdis == null || bdis.tell() <= 0) {
return null;
}
do {
c = isd.readCharBack();
if (c != cmin1 && c != '\r') {
s = c + s;
strwidth += fch.charWidth(c);
}
if ((c == cmin1) || (c == '\n' && s.length() > 1)) // новая строка или начало файла
{
wordWrap = false;
break;
}
if (c == ' ') {
afterspace = 1;
} else if (c == '\n') {
afterspace = 0;
} else if (afterspace >= 0) {
afterspace++;
}
} while (strwidth < maxStrWidth);
if (wordWrap && afterspace >= 0 && s.length() > afterspace) {
cut += afterspace;
} else if ((strwidth > maxStrWidth && c != ' ') || (c == '\n' && s.length() > 1)) {
cut = 1;
}
if (cut > 0) {
s = s.substring(cut, s.length());
if (enc.compareTo("UTF-8") != 0) {
bdis.seek(bdis.tell() + cut);
} else {
for (int i = 0; i < cut; i++) {
isd.readChar();
}
}
}
} catch (IOException iox) {
return null;
}
return s;
}
/**
* Прочитать экран из потока
*/
void readScreen(boolean wordWrap) {
try {
for (int i = 0; i < linesPerScreen; i++) {
lineposes[i] = bdis.tell();
lines[i] = readString(wordWrap);
}
lineposes[linesPerScreen] = bdis.tell();
scrStart = lineposes[0];
scrEnd = lineposes[linesPerScreen];
} catch (IOException iox) {
iox.printStackTrace();
}
}
/**
* Очистить экран
*/
void clearScreen() {
for (int i = 0; i < linesPerScreen; i++) {
lineposes[i] = 0;
lines[i] = null;
}
lineposes[linesPerScreen] = 0;
}
/**
* Перейти строчкой выше
*/
void lineUp() {
try {
if (scrStart > 0) {
bdis.seek(scrStart);
scrEnd = lineposes[linesPerScreen] = lineposes[linesPerScreen - 1];
for (int i = linesPerScreen - 1; i > 0; i--) {
lines[i] = lines[i - 1];
lineposes[i] = lineposes[i - 1];
}
lines[0] = readStringBack(wordWrapGlobal);
scrStart = lineposes[0] = bdis.tell();
bdis.seek(scrEnd);
}
} catch (IOException iox) {
return;
}
}
/**
* Перейти строчкой ниже
*/
void lineDown() {
try {
if (scrEnd < bdis.getCapacity()) {
scrStart = lineposes[1];
for (int i = 0; i < linesPerScreen - 1; i++) {
lines[i] = lines[i + 1];
lineposes[i] = lineposes[i + 1];
}
lineposes[linesPerScreen - 1] = lineposes[linesPerScreen];
lines[linesPerScreen - 1] = readString(wordWrapGlobal);
lineposes[linesPerScreen] = scrEnd = bdis.tell();
}
} catch (IOException iox) {
}
}
/**
* Перейти экраном выше
*/
void screenUp() {
try {
bdis.seek(scrStart);
for (int i = 0; i < linesPerScreen; i++) {
readStringBack(false);
}
readScreen(wordWrapGlobal);
} catch (Exception iox) {
return;
}
}
/**
* Перейти экраном ниже
*/
void screenDown() {
try {
if (scrEnd < bdis.getCapacity()) {
readScreen(wordWrapGlobal);
}
} catch (Exception iox) {
}
}
/**
* Функция отрисовки
*/
protected void paint(Graphics g) {
g.drawImage(back, w/2, h/2, 3);
g.setColor(UI.def);
g.setFont(fntText);
for (int i = 0; i < linesPerScreen; i++) {
if (lines[i] != null) {
try {
parse(g, lines[i], 2, header + 2 + i * (fntTextHeight + 1)); //g.drawString(lines[i], 2, header + 2 + i * (fntTextHeight + 1), Graphics.LEFT | Graphics.TOP);
} catch (Exception ex) {
g.drawString(lines[i], 2, header + 2 + i * (fntTextHeight + 1), Graphics.LEFT | Graphics.TOP);
}
}
}
drawPosition(g);
UI.drawMenuInterface(g,caption,"Назад");
}
/**
* Обработчик нажатия клавиши
*/
protected void keyPressed(int key) {
int ga;
try {
ga = getGameAction(key);
} catch (Exception e) {
ga = 0;
}
if (key == KEY_NUM1)//Прыгнуть вверх
{
scrStart = bdis.bpos = 0;
readScreen(wordWrapGlobal);
} else if (key == KEY_NUM3) {
fntTextc++;
if (fntTextc > maxnumFont) {
fntTextc = 1;
}
switchFont();
} else if (key == KEY_NUM9) {
fntTextc--;
if (fntTextc < 1) {
fntTextc = maxnumFont;
}
switchFont();
} else if (key == KEY_NUM7)//Прыгнуть вниз
{
bdis.bpos = bdis.capacity - 3;
readScreen(wordWrapGlobal);
}if (ga==UP) {
lineUp();
} else if (ga==DOWN) {
lineDown();
} else if (ga==RIGHT) {
screenDown();
} else if (ga==LEFT) {
screenUp();
} else if (key == KEY_STAR) {
showimage=!showimage;
} else if (key == Key.rightSoftKey || key == Key.Back || key==KEY_NUM0) // выход
{
closeStream();
}
repaint();
}
protected void pointerPressed(int pix, int piy) {
dry = piy;
int y = UI.getSoftBarHeight();
if(pix<2*y && piy>h-y) {
closeStream();
}else if(pix>w-2*y && piy>h-y) {
closeStream();
}
}
protected void pointerDragged(int pix, int piy) {
if(dry>piy) {
while(dry>piy) {
dry-=fntText.getHeight();
lineDown();
}
}else{
while(dry<piy) {
dry+=fntText.getHeight();
lineUp();
}
}
repaint();
}
/**
* Обработчик повторения (зажатия) клавиши
*/
protected void keyRepeated(int keyCode) {
int ga = getGameAction(keyCode);
if (ga==UP) {
lineUp();
} else if (ga==DOWN) {
lineDown();
} else if (ga==RIGHT) {
screenDown();
} else if (ga==LEFT) {
screenUp();
}
repaint();
}
public void parse(Graphics g, String all, int xcar, int ycar) throws Exception {
int x=0;
String[] cs = threshold(all, ' ', true);
for (int i = 0; i < cs.length; i++) {
String s = cs[i].toLowerCase();
if(s.startsWith("img")) {
if(!showimage) continue;
Image img = getImage(s.substring(3).trim());
g.drawImage(img, w/2, ycar, 17);
g.drawRect(w/2-img.getWidth()/2, ycar, img.getWidth(), img.getHeight());
continue;
}
if (s.startsWith("#")) {
getColor(g, s.substring(1).toLowerCase());
//i++;
continue;
}else{
int temp = fntText.stringWidth(cs[i]+" ");
g.drawString(cs[i].replace('\n',' '), x+xcar, ycar, 20); // то выводим
x+=temp;
}
}
}
private void drawPosition(Graphics g) {
g.setColor(fore);
int slall = h - header - footer;
int slpos = 0;
int slend = 0;
try {
slpos = header + slall * scrStart / bdis.getCapacity();
slend = header + slall * scrEnd / bdis.getCapacity();
if (slend > h - footer) {
slend = h - footer;
}
} catch (Exception iox) {
return;
}
g.drawLine(w - 1, slpos, w - 1, slend);
}
private Image getImage(String path) {
Image img = Image.createImage(1, 1);
try {
img = Image.createImage(path);
} catch (IOException ex) {
ex.printStackTrace();
}
return img;
}
public static String[] threshold(String s, char c, boolean remove)
{
Vector ml = new Vector();
int j = s.length();
String s2 = "";
for(int k = 0; k < j; k++)
{
int i = s.charAt(k);
if(i == c)
{
if(s2.length() > 0)
{
if(!remove) s2+=" "+String.valueOf(c);
ml.addElement(s2);
s2 = "";
}
} else
{
s2 = s2 + String.valueOf((char)i);
}
}
if(s2.length() > 0) {
if(!remove) s2+=" "+String.valueOf(c);
ml.addElement(s2);
}
String[] m = new String[ml.size()];
ml.copyInto(m);
return m;
}
private void getColor(Graphics g, String q) {
// Считывание цветов, которые записаны в виде названия цвета
if (q.equals("yellow")) g.setColor(255, 255, 0);
else if (q.equals("def")) g.setColor(UI.def);
else if (q.equals("pink")) g.setColor(255, 192, 203);
else if (q.equals("orange")) g.setColor(255, 165, 0);
else if (q.equals("gold")) g.setColor(255, 215, 0);
else if (q.equals("lime")) g.setColor(0, 255, 0);
else if (q.equals("red")) g.setColor(255, 0, 0);
else if (q.equals("green")) g.setColor(0, 128, 0);
else if (q.equals("blue")) g.setColor(0, 0, 255);
else if (q.equals("black")) g.setColor(0, 0, 0);
else if (q.equals("white")) g.setColor(255, 255, 255);
else if (q.equals("purple")) g.setColor(0, 0, 255);
else if (q.equals("maroon")) g.setColor(128, 0, 0);
else if (q.equals("0")) g.setColor(0, 0, 0);
// Считывание цветов в HEX
if (q.length()==6) g.setColor(Integer.parseInt(q,16));
}
private void switchFont() {
switch (fntTextc) {
case 1:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
init();
break;
case 2:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_SMALL);
init();
break;
case 3:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
init();
break;
case 4:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
init();
break;
case 5:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE);
init();
break;
case 6:
fntText = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE);
init();
break;
}
}
}

369
src/UI.java Normal file
View File

@ -0,0 +1,369 @@
import java.util.Calendar;
import javax.microedition.lcdui.*;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author aNNiMON
*/
public class UI {
protected static final Font smallFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);
protected static final Font bigboldFont = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_LARGE);
public static Font stFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM);
public static Font bstFont = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
public static int w=getWidth(),h=getHeight();
public static int col1=0xD0419f62, col2=0xD077da9a;
public static int curcol1=0xDCF8D6, curcol2=0x75B68C;
public static int textcolor=0xFFFFFF, timecolor=0xFFFFFF;
public static int textnc = 0x296321, shadow = 0x282828, def = 0xFFFFFF;
public static int osv=180;
//int col1=0xD0419f62, col2=0xD077da9a;джунгли
private static int MFHeight = smallFont.getHeight();
private static boolean isLight=false;
public static void drawSoftBar(Graphics g, String left, String right) {
int y = h - getSoftBarHeight() + 1;
int fontHeight = MFHeight;
int cY = (h + y + 1 - fontHeight) / 2;
if (isLight) {
g.setColor(col2);
g.fillRect(0, y - 1, w, h - y + 1);
} else {
drawRect(g, col2, col1, 0, y - 1, w, h - y + 1);
}
g.setColor(textcolor);
g.setFont(smallFont);
if (left != null) {
g.drawString(left, 2, cY, Graphics.TOP | Graphics.LEFT);
}
if (right != null) {
g.drawString(right, (w - 2), cY, Graphics.TOP | Graphics.RIGHT);
}
}
public static void drawMenuInterface(Graphics g, String title, String leftsoft, String rightsoft) {
drawTitle(g, title);
drawTimeSoftBar(g, leftsoft, rightsoft);
}
public static void drawMenuInterface(Graphics g, String title, String rightsoft) {
drawTitle(g, title);
drawSoftBar(g, "", rightsoft);
}
public static void drawTimeSoftBar(Graphics g, String left, String right) {
int y = h - getSoftBarHeight() + 1;
int fontHeight = MFHeight;
int cY = (h + y + 1 - fontHeight) / 2;
showTime(g, smallFont, w/2, h);
g.setColor(textcolor);
g.setFont(smallFont);
if (left != null) {
g.drawString(left, 2, cY, Graphics.TOP | Graphics.LEFT);
}
if (right != null) {
g.drawString(right, (w - 2), cY, Graphics.TOP | Graphics.RIGHT);
}
}
public static void drawTitle(Graphics g, String title) {
if (isLight) {
g.setColor(col1);
g.fillRect(0, 0, w, getSoftBarHeight() + 1);
} else {
drawRect(g, col1, col2, 0, 0, w, getSoftBarHeight() + 1);
}
if (title != null) {
g.setColor(textcolor);
g.setFont(smallFont);
g.drawString(title, w / 2, 2, Graphics.TOP | Graphics.HCENTER);
}
}
public static void drawSTR(Graphics g, String str, String cx, String cy, int x, int y) {
int color = 0x90626C68;
if (isLight) {
g.setColor(color);
g.fillRect(x - 5, y, smallFont.stringWidth(str + "H"), MFHeight);
} else {
drawRGB(g, color, transformARGBColorLight(color, -64), x - 5, y, smallFont.stringWidth(str + "H"), MFHeight);
}
color = 0x90335E9E;
if (isLight) {
g.setColor(color);
g.fillRect(x - 5 + smallFont.stringWidth(str + "H"), y, smallFont.stringWidth("" + cx + ":" + cy + "H"), MFHeight);
} else {
drawRGB(g, color, transformARGBColorLight(color, -64), x - 5 + smallFont.stringWidth(str + "H"), y, smallFont.stringWidth("" + cx + ":" + cy + "H"), MFHeight);
}
g.setColor(0x00);
g.setFont(smallFont);
if (str != null) {
g.drawString(str, x, y, Graphics.TOP | Graphics.LEFT);
}
if (!cx.equals("")) {
x = x + smallFont.stringWidth(str + "H");
g.drawString(cx, x, y, Graphics.TOP | Graphics.LEFT);
}
if (!cy.equals("")) {
x = x + smallFont.stringWidth(cx + "H");
g.drawString(cy, x, y, Graphics.TOP | Graphics.LEFT);
}
}
public static void showTime(Graphics g, Font font, int x, int y) {
Calendar calendar = Calendar.getInstance();
String s = calendar.get(11) + "";
String s1 = calendar.get(12) + "";
if (s.length() == 1) s = "0" + s;
if (s1.length() == 1) s1 = "0" + s1;
int r1=Effects.acolor(col2, 'r');
int g1=Effects.acolor(col2, 'g');
int b1=Effects.acolor(col2, 'b');
int fh=UI.getSoftBarHeight()-2;
g.setColor(r1, g1, b1);
g.fillRect(0, (h-fh)+1, w, fh);
int k = font.stringWidth(s + ":" + s1) / 2;
g.setFont(font);
g.setColor(timecolor);
g.drawString(s + ":" + s1, x - k, y, 36);
}
public static void drawSTR(Graphics g, String str, String cx, String cy) {
int allw;
int all1w = str.equals("") ? 0 : smallFont.stringWidth(str + "H");
int all2w = cx.equals("") ? 0 : smallFont.stringWidth(cx + "H");
int all3w = cy.equals("") ? 0 : smallFont.stringWidth(cy + "H");
allw = all1w + all2w + all3w;
int x = 0;
x = w / 2 - allw / 2;
int y = h - 2 * getSoftBarHeight();
if (isLight) {
g.setColor(col2);
g.fillRect(x - 5, y, allw, MFHeight);
} else {
drawRect(g, col2, 0x4EAFDA, x - 5, y, allw, MFHeight);
}
g.setColor(0x00);
g.setFont(smallFont);
if (str != null) {
g.drawString(str, x, y, Graphics.TOP | Graphics.LEFT);
}
if (!cx.equals("")) {
x = x + smallFont.stringWidth(str + "H");
g.drawString(cx, x, y, Graphics.TOP | Graphics.LEFT);
}
if (!cy.equals("")) {
x = x + smallFont.stringWidth(cx + "H");
g.drawString(cy, x, y, Graphics.TOP | Graphics.LEFT);
}
}
public static int getWidth() {
return JM.midlet.cnv.getWidth();
}
public static int getHeight() {
return JM.midlet.cnv.getHeight();
}
static public int transformColorLight(int color, int light) {
int r = (color & 0xFF) + light;
int g = ((color >> 8) & 0xFF) + light;
int b = ((color >> 16) & 0xFF) + light;
if (r < 0) {
r = 0;
} else if (r > 255) {
r = 255;
}
if (g < 0) {
g = 0;
} else if (g > 255) {
g = 255;
}
if (b < 0) {
b = 0;
} else if (b > 255) {
b = 255;
}
return r | (g << 8) | (b << 16);
}
static public int transformARGBColorLight(int color, int light) {
int r = (color & 0xFF) + light;
int g = ((color >> 8) & 0xFF) + light;
int b = ((color >> 16) & 0xFF) + light;
int a = ((color >> 24) & 0xFF) + light;
if (a < 0) {
a = 0;
} else if (a > 255) {
a = 255;
}
if (r < 0) {
r = 0;
} else if (r > 255) {
r = 255;
}
if (g < 0) {
g = 0;
} else if (g > 255) {
g = 255;
}
if (b < 0) {
b = 0;
} else if (b > 255) {
b = 255;
}
return (a << 24) | (r << 16) | (g << 8) | b;
}
static public int trARGBBoolColorLight(int color, int light,
boolean ia, boolean ir, boolean ig, boolean ib) {
int r, g, b, a;
if (ir) {
r = ((color >> 16) & 0xFF) + light;
int qa = (color >> 24) & 0xff;
int qg = (color >> 8) & 0xff;
int qb = color & 0xff;
if (r < 0) {
r = 0;
} else if (r > 255) {
r = 255;
}
return (qa << 24) | (r << 16) | (qg << 8) | qb;
}
if (ig) {
g = ((color >> 8) & 0xFF) + light;
int qa = (color >> 24) & 0xff;
int qr = (color >> 16) & 0xff;
int qb = color & 0xff;
if (g < 0) {
g = 0;
} else if (g > 255) {
g = 255;
}
return (qa << 24) | (qr << 16) | (g << 8) | qb;
}
if (ib) {
b = (color & 0xFF) + light;
int qa = (color >> 24) & 0xff;
int qr = (color >> 16) & 0xff;
int qg = (color >> 8) & 0xff;
if (b < 0) {
b = 0;
} else if (b > 255) {
b = 255;
}
return (qa << 24) | (qr << 16) | (qg << 8) | b;
}
if (ia) {
a = ((color >> 24) & 0xFF);
int qr = (color >> 16) & 0xff;
int qg = (color >> 8) & 0xff;
int qb = color & 0xff;
if (a < 0) {
a = 0;
} else if (a > 255) {
a = 255;
}
return (a << 24) | (qr << 16) | (qg << 8) | qb;
}
return color;
}
public static void drawRect(Graphics g, int color1, int color2, int x1, int y1, int w, int h) {
int r1 = ((color1 & 0xFF0000) >> 16);
int g1 = ((color1 & 0x00FF00) >> 8);
int b1 = (color1 & 0x0000FF);
int r2 = ((color2 & 0xFF0000) >> 16);
int g2 = ((color2 & 0x00FF00) >> 8);
int b2 = (color2 & 0x0000FF);
int count = h / 3;
if (count < 0) {
count = -count;
}
if (count < 8) {
count = 8;
}
int crd1, crd2;
for (int i = count - 1; i >= 0; i--) {
crd1 = i * h / count + y1;
crd2 = (i + 1) * h / count + y1;
if (crd1 == crd2) {
continue;
}
g.setColor(i * (r2 - r1) / (count - 1) + r1, i * (g2 - g1) / (count - 1) + g1, i * (b2 - b1) / (count - 1) + b1);
g.fillRect(x1, crd1, w, crd2 - crd1);
}
}
public static void drawTransparentRoundRect(Graphics graphics, int color1, int color2, int xn, int yn, int wdh, int hgt, int ar, boolean up) {
int r1 = ((color1 & 0xFF0000) >> 16);
int g1 = ((color1 & 0x00FF00) >> 8);
int b1 = (color1 & 0x0000FF);
int r2 = ((color2 & 0xFF0000) >> 16);
int g2 = ((color2 & 0x00FF00) >> 8);
int b2 = (color2 & 0x0000FF);
int r,g,b;
try {
wdh+=xn;
hgt+=yn;
for (int i=yn; i<hgt; i++) {
r=r1 + (((i - hgt) + 1) * (r2 - r1)) / (hgt - yn - 1) + (r2 - r1);
g=g1 + (((i - hgt) + 1) * (g2 - g1)) / (hgt - yn - 1) + (g2 - g1);
b=b1 + (((i - hgt) + 1) * (b2 - b1)) / (hgt - yn - 1) + (b2 - b1);
graphics.setColor (r,g,b);
if(up && hgt-i<=ar) {
graphics.drawLine (xn+2^(hgt-i),i,wdh-1-2^(hgt-i),i);
}else if(!up && i<=ar) {
graphics.drawLine (xn+2^(hgt-i),i,wdh-1-2^(hgt-i),i);
}else graphics.drawLine (xn,i,wdh-1,i);
}
}catch(Exception ex) {}
}
public static void drawRGB(Graphics g, int color1, int color2, int x1, int y1, int w, int h) {
int a1 = (color1 >> 24) & 0xff;
int r1 = ((color1 & 0x00FF0000) >> 16);
int g1 = ((color1 & 0x0000FF00) >> 8);
int b1 = (color1 & 0x000000FF);
int a2 = (color2 >> 24) & 0xff;
int r2 = ((color1 & 0x00FF0000) >> 16);
int g2 = ((color2 & 0x0000FF00) >> 8);
int b2 = (color2 & 0x000000FF);
int count = h / 3;
if (count < 0) {
count = -count;
}
if (count < 8) {
count = 8;
}
int crd1, crd2;
for (int i = count - 1; i >= 0; i--) {
crd1 = i * h / count + y1;
crd2 = (i + 1) * h / count + y1;
if (crd1 == crd2) {
continue;
}
int[] pixelArray = new int[w * (crd2 - crd1)];
for (int zi = 0; zi < pixelArray.length; zi++) {
pixelArray[zi] = (int) ((i * (a2 - a1) / (count - 1) + a1) << 24) |
((i * (r2 - r1) / (count - 1) + r1) << 16) |
((i * (g2 - g1) / (count - 1) + g1) << 8) | (i * (b2 - b1) / (count - 1) + b1);
}
g.drawRGB(pixelArray, 0, w, x1, crd1, w, crd2 - crd1, true);
}
}
static public int getSoftBarHeight() {
return smallFont.getHeight() + 2;
}
}

116
src/Util.java Normal file
View File

@ -0,0 +1,116 @@
import java.io.*;
import java.util.Vector;
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author aNNiMON
*/
public class Util {
public static String[] getDataAList(String path) {
String[] list = null;
try {
InputStream is = JM.midlet.getClass().getResourceAsStream("/xml/" + path);
list = threshold(getText(is), "\n", true);
is.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return list;
}
public static String[] getPathAList(String path) {
String[] list = null;
try {
InputStream is = JM.midlet.getClass().getResourceAsStream("/xml/" + path);
list = threshold(getText(is), "\n", false);
is.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return list;
}
public static String getText(InputStream is) {
StringBuffer strBuff = new StringBuffer();
int ch = 0;
try {
while ((ch = is.read()) != -1) strBuff.append((char) ((ch >= 0xc0 && ch <= 0xFF) ? (ch + 0x350) : ch));
} catch (Exception e) {e.printStackTrace();}
return strBuff.toString();
}
public static String[] threshold(String s, String s1, boolean data)
{
Vector ml = new Vector();
Vector vl = new Vector();
char c = s1.charAt(0);
int j = s.length();
String s2 = "";
for(int k = 0; k < j; k++)
{
int i = s.charAt(k);
if(i == c)
{
if(s2.length() > 0)
{
if(data) ml.addElement(s2.substring(0, s2.lastIndexOf('-')).replace('^', '-').trim());
else vl.addElement(s2.substring(s2.lastIndexOf('-')+1).replace('^', '-').trim());
s2 = "";
}
} else
{
s2 = s2 + String.valueOf((char)i);
}
}
if(s2.length() > 0) {
if(data) ml.addElement(s2.substring(0, s2.lastIndexOf('-')).replace('^', '-').trim());
else vl.addElement(s2.substring(s2.lastIndexOf('-')+1).replace('^', '-').trim());
}
String[] m;
if(data) {
m = new String[ml.size()];
ml.copyInto(m);
}else{
m = new String[vl.size()];
vl.copyInto(m);
}
return m;
}
public static void getUI(String path) {
try {
String[] k = null;
InputStream is = JM.midlet.getClass().getResourceAsStream(path);
k = threshold(getText(is), "\n", false);
UI.col1 = color(k[0]);
UI.col2 = color(k[1]);
UI.curcol1 = color(k[2]);
UI.curcol2 = color(k[3]);
UI.osv = Integer.parseInt(k[4].trim().replace('^', '-'));
UI.textcolor = color(k[5]);
UI.timecolor = color(k[6]);
UI.textnc = color(k[7]);
UI.shadow = color(k[8]);
UI.def = color(k[9]);
is.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
private static int color(String str) {
int i = 0;
try {
i=Integer.parseInt(str.trim(), 16);
}catch(Exception ex) {
i=Integer.parseInt(str.trim());
}
return i;
}
}

266
src/aNMPWR.java Normal file
View File

@ -0,0 +1,266 @@
import javax.microedition.lcdui.*;
public class aNMPWR extends Canvas implements Runnable {
public String pathFile, aaall;
private int FileY, CursorY, startPrintFile;
private int cu, h, w, sh, fh;
private Font MainFont = Font.getFont(Font.STYLE_PLAIN, Font.STYLE_PLAIN, Font.SIZE_SMALL);
private Font BordFont = Font.getFont(Font.STYLE_PLAIN, Font.STYLE_BOLD, Font.SIZE_SMALL);
public static boolean screen;
private String[][] back = new String[10][50];
private String[][] data = new String[10][50];
private int[] index = new int[10];
private int idx=0, len=0;
private Image iback;
private int bb=0;
private long ty;
private boolean prkr=false, moveleft=true;
private Thread thr;
public aNMPWR(Image img) {
setFullScreenMode(true);
FileY = 0; CursorY = 0; startPrintFile = 0; cu = 0;
screen = true;
iback=img;
thr = new Thread(this);
pathFile = "main.al";
w = getWidth(); h = getHeight();
fh = MainFont.getHeight() + 2;
sh = BordFont.getHeight() + 3;
thr.start();
restart();
}
public aNMPWR(String s) {
setFullScreenMode(true);
FileY = 0; CursorY = 0; startPrintFile = 0; cu = 0;
screen = true;
pathFile = s;
thr = new Thread(this);
w = getWidth(); h = getHeight();
fh = MainFont.getHeight() + 2;
sh = BordFont.getHeight() + 3;
thr.start();
restart();
}
public void run() {
while(true) {
if(prkr) {
if(moveleft) {
if (bb > -(len-w)) {
bb -= 2;
} else {moveleft=!moveleft;}
}else{
if (bb < 0) {
bb += 2;
} else {moveleft=!moveleft;}
}
try {
Thread.sleep(100L);
} catch (Exception ex) {}
repaint();
}
}
}
public void paint(Graphics g) {
setFullScreenMode(screen);
g.drawImage(iback, w/2, h/2, 3);
mainDisp(g);
if(pathFile.equals("main.al")) UI.drawMenuInterface(g, JM.name, "Выбор","Назад");
else UI.drawMenuInterface(g, data[idx-1][index[idx-1]], "Выбор","Назад");
}
private void mainDisp(Graphics g) {
g.setFont(MainFont);
g.translate(0, sh);
FileY = 0;
for (int i = startPrintFile; i < data[idx].length; i++) {
if (FileY == CursorY) {
drawCursor(g);
g.setColor(UI.shadow);
g.setFont(BordFont);
len = BordFont.stringWidth(data[idx][i]);
if(len<w) {
prkr=false;
g.drawString(data[idx][i], w/2, FileY+1, 17);
}
else {
prkr=true;
g.drawString(data[idx][i], bb, FileY+1, 20);
}
FileY += fh;
continue;
}
g.setColor(UI.textnc);
g.setFont(MainFont);
g.drawString(data[idx][i], w/2, FileY+1, 17);
FileY += fh;
}
g.translate(0, -sh);
}
private void restart() {
if(pathFile.toLowerCase().endsWith(".al")) {
data[idx] = Util.getDataAList(pathFile);
back[idx] = Util.getPathAList(pathFile);
}
}
private void backDir() {
if(pathFile.equals("main.al") || idx==0) {JM.midlet.dsp.setCurrent(new Menu(iback));return;}
idx--;
if(idx>0) pathFile=back[idx-1][index[idx]];
if(idx==0) pathFile="main.al";
CursorY = index[idx]*fh;
cu = index[idx];
startPrintFile = 0;
}
private void nextDir(int s) {
if(back[idx][s].toLowerCase().endsWith(".al")) {
pathFile = back[idx][s];
index[idx]=s;
idx++;
restart();
cu = 0;
startPrintFile = 0;
CursorY = 0;
}else{
TextView tv = new TextView(iback);
//Viewer tv = new Viewer(Util.getText(JM.midlet.getClass().getResourceAsStream(back[idx][s])), this);
tv.openFile(back[idx][s], this, data[idx][s]);
JM.midlet.dsp.setCurrent(tv);
}
}
public void keyPressed(int i) {
bb=0;moveleft=true;
int ga;
try {
ga = getGameAction(i);
} catch (Exception e) {
ga = 0;
}
if (i == Key.leftSoftKey) {
nextDir(cu);
}
if (i == Key.rightSoftKey || i==Key.Back || i==KEY_NUM0) {
backDir();
}
switch (ga) {
case RIGHT:
case DOWN:
cursorDown();
break;
case LEFT:
case UP:
cursorUp();
break;
case FIRE:
nextDir(cu);
break;
}
switch (i) {
case 35:
screen=!screen;
setFullScreenMode(screen);
JM.midlet.cnv.setFullScreenMode(screen);
UI.w = w = getWidth(); UI.h = h = getHeight();
break;
}
repaint();
}
protected void pointerPressed(int pix, int piy) {
int q = UI.getSoftBarHeight();
if(pix<2*q && piy>h-q) {
nextDir(cu);
}else if(pix>w-2*q && piy>h-q) {
JM.midlet.destroyApp(true);
}else{
int cu1=cu;
piy-=q;
if(piy>0 && piy<data[idx].length*fh) {
cu=piy/fh;
CursorY = cu*fh;
}
if(System.currentTimeMillis()-ty<700 && cu1==cu) nextDir(cu);
ty = System.currentTimeMillis();
}
repaint();
}
public void keyRepeated(int i) {
keyPressed(i);
}
private void drawCursor(Graphics g) {
/*int r1=249, r2=214,
g1=250, g2=217,
b1=251, b2=223;*/
int r1=Effects.acolor(UI.curcol1, 'r');int r2=Effects.acolor(UI.curcol2, 'r');
int g1=Effects.acolor(UI.curcol1, 'g');int g2=Effects.acolor(UI.curcol2, 'g');
int b1=Effects.acolor(UI.curcol1, 'b');int b2=Effects.acolor(UI.curcol2, 'b');
int pr,pg,pb;
int yn=0;
int curw = BordFont.stringWidth(data[idx][cu])+1;
for(int i=0; i<fh; i++) {
for(int j=curw; j<curw+fh/2; j++) {
pr=r1 + (((i - fh) + 1) * (r2 - r1)) / (fh - yn - 1) + (r2 - r1);
pg=g1 + (((i - fh) + 1) * (g2 - g1)) / (fh - yn - 1) + (g2 - g1);
pb=b1 + (((i - fh) + 1) * (b2 - b1)) / (fh - yn - 1) + (b2 - b1);
int prgb=(pr+pg+pb)/3;
g.setColor(prgb, prgb, prgb);
g.drawLine(0, FileY+1+i, w, FileY+1+i);
g.setColor(pr, pg, pb);
g.drawLine(w/2-j/2-i, FileY+1+i, w/2+j/2+i, FileY+1+i);
}
}
}
private void cursorDown() {
if (data[idx].length > 0) {
if (cu == data[idx].length - 1) {
CursorY = 0;
cu = 0;
startPrintFile = 0;
} else if (cu > (h - 2 * sh) / fh - 3) {
if (CursorY >= h - 2 * sh - 2 * fh) {
startPrintFile++;
cu++;
} else {
cu++;
CursorY += fh;
}
} else {
CursorY += fh;
cu++;
}
return;
}
}
private void cursorUp() {
if (data[idx].length > 0) {
if (cu == 0) {
cu = data[idx].length - 1;
if (data[idx].length > (h - 2 * sh) / fh) {
startPrintFile = (data[idx].length - (h - 2 * sh) / fh) + 1;
CursorY = (data[idx].length - 1 - startPrintFile) * fh;
} else {
CursorY = (data[idx].length - 1) * fh;
}
} else if ((CursorY == 0) & (cu > 0)) {
startPrintFile--;
cu--;
} else if (CursorY > 0) {
CursorY -= fh;
cu--;
}
}
}
}

View File

@ -0,0 +1,575 @@
/**************************************\
* Буферизованный ввод/вывод *
** **
* Буферизованный поток ввода *
* (c) 2005+, Vitali Filippov [VMX] *
* *
* BufDataInputStream.java *
* Created on 24 Oct 2005, 13:25 *
\**************************************/
package com.vmx;
import java.io.*;
import javax.microedition.io.*;
/**
* Class for buffered data input
* For documentation, see java.io.DataInput
*/
public class BufDataInputStream extends InputStream implements DataInput {
public static byte buffer[];
protected int bmax;
// protected int bstreampos;
protected int markedPos;
public static int capacity, is_available, bpos, blen;
protected boolean markSupp;
protected InputStream is;
/**
* Конструктор
*/
public BufDataInputStream(int bufsize, InputStream iis, boolean read) throws IOException {
if (bufsize <= 0) {
throw new IOException("Buffer size must be greater than 0"); // bmax = bufsize;
}
bpos = blen = 0;
// bstreampos = 0;
is = iis;
capacity = is_available = is.available ();
buffer = new byte[capacity];
if (is != null)//Если мы создаём файл то is нулевой потому из него не читаем
{
is.read(buffer);
}
bmax = is_available;
// if (markSupp = is.markSupported ())
// is.mark (capacity + 0x100);
markedPos = -1;
}
/**
* Закрытие буферизованного потока вместе с тем, на котором
* он основан.
*/
public void close() throws IOException {
if (is != null) {
is.close();
}
}
/**
* Возвращает количество байт, которые ещё возможно прочесть из
* этого буферизованного потока.
*/
public int available() {
return blen - bpos + is_available;
}
/**
* Получить объём потока
*/
public int getCapacity() {
return capacity;
}
/**
* Перейти к положению pos
*/
public void seek(int pos) {
// System.out.println (" <= " + pos + " < " + (blen));
/* if (pos >= bstreampos && pos < bstreampos+blen)
{ bpos = pos-bstreampos;
}else
{ System.out.println("seek else");
is.reset ();
is.skip (pos);
bufferize ();
}*/
bpos = pos;
}
/**
* Возвращает текущую позицию в буферизованном потоке.
*/
public int tell() throws IOException {
return capacity - available();
// return bpos;
}
/**
* Ставит метку, на которую возвращаться потом можно по reset.
*/
public void mark(int readlimit) {
try {
markedPos = tell();
} catch (IOException ix) {
markedPos = -1;
}
}
/**
* Возвращает, доступны ли функции mark() и reset()?
*/
public boolean markSupported() {
return is.markSupported();
}
/**
* Перейти на последнюю заданную mark'ом позицию.
*/
public void reset() throws IOException {
if (markedPos >= 0) {
seek(markedPos);
} else {
throw new IOException("call mark() before reset()");
}
}
/**
* пропустить n байт
*/
public long skip(long n) throws IOException {
if (n < blen - bpos) {
bpos += n;
return n;
} else {
long act = blen - bpos;
n -= blen - bpos;
act += is.skip(n);
// bufferize ();
return act;
}
}
/**
* Прочитать массив из потока: прочитать и записать максимум len байт,
* записать их в b[], начиная со смещения off, и вернуть количество
* считанных байт.
*/
/* public int read (byte [] b, int off, int len) throws IOException
{
int rest = len, pos = off, n;
while (rest > 0)
{
// if (bpos >= blen && bufferize() <= 0) // данные кончились?
if (bpos > buffer.length) // данные кончились?
{
blen = 0;
break;
} // если буфер кончился, а bufferize заполнило его чем-то - будет ок
n = rest;
if (n > blen-bpos)
n = blen-bpos;
System.arraycopy (buffer, bpos, b, pos, n);
pos += n;
bpos += n;
rest -= n;
}
return len-rest;
}*/
/**
* Прочитать массив b[] полностью - эквивалентно read (b, 0, b.length);
*/
/* public int read (byte [] b) throws IOException
{
return read (b, 0, b.length);
}*/
/**
* Прочитать 1 байт из потока, вернуть его, если успешно, и -1,
* если достигнут конец потока.
*/
public int read() throws IOException {
/* if (bpos >= blen && bufferize() <= 0){ // данные кончились?
return -1;}*/
if (bpos > buffer.length) {
return -1;
}
return ((int) buffer[bpos++]) & 0xFF;
}
/**
* Прочитать 1 байт из потока назад, если начало файла - вернуть -1.
* Для работы требуется поддержка mark() и reset()
*/
public int readBack() throws IOException {
if (bpos == 0) {
if (available() == capacity /* || !markSupp */) {
return -1;
}
int old = tell();
// bstreampos -= bmax;
// if (bstreampos < 0)
// bstreampos = 0;
// is.reset ();
// is.skip (bstreampos);
// bufferize ();
bpos = old;
}
return ((int) buffer[--bpos]) & 0xFF;
}
/**
* Если буфер не полон, дочитать и дополнить его.
*/
/* public void flush () throws IOException
{
if (is_available > 0)
{
if (bpos != 0 && bpos != blen)
System.arraycopy (buffer, bpos, buffer, 0, blen-bpos);
blen -= bpos;
// bstreampos += bpos;
bpos = 0;
int blenp = is.read (buffer, blen, bmax-blen);
blen += blenp;
is_available -= blenp;
}
}*/
/**
* Убивает текущий буфер и буферизует с текущего положения InputStream'а
*/
/* protected int bufferize () throws IOException
{
// is_available = is.available ();
is_available = available ();
// bstreampos = capacity - is_available;
blen = bpos = 0;
if (is_available > 0)
{
// blen = is.read (buffer, 0, bmax);
blen = available ();
is_available -= blen;
}
return blen;
}*/
/**
* Обновить содержимое буфера в соответствии с потоком
*/
/* public void updateBuffer () throws IOException
{
is.reset ();
// is.skip (bstreampos);
// bufferize ();
}*/
/**
* Прочитать булево значение из потока (см. DataInput)
*/
public boolean readBoolean() throws IOException {
int r = read();
if (r == -1) {
throw new IOException("EOF");
}
return r != 0;
}
/**
* Прочитать байт из потока; если достигнут конец потока,
* генерируется исключение IOException с сообщением "EOF" (см. DataInput)
*/
public byte readByte() throws IOException {
int r = read();
if (r == -1) {
throw new IOException("EOF");
}
return (byte) r;
}
/**
* Прочитать символ (Unicode Big Endian) из потока (см. DataInput)
*/
public char readChar() throws IOException {
return (char) ((readUnsignedByte() << 8) | readUnsignedByte());
}
/**
* Прочитать массив b[] из потока целиком, если целиком не получится,
* сгенерировать исключение IOException с сообщением "EOF"
*/
public void readFully(byte[] b) throws IOException {
if (read(b) < b.length) {
throw new IOException("EOF");
}
}
/**
* Прочитать в точности len байт и записать их в массив b[], начиная
* со смещения off. Если достигнут конец файла - сгенерировать
* исключение IOException с сообщением "EOF"
*/
public void readFully(byte[] b, int off, int len) throws IOException {
if (read(b, off, len) < len) {
throw new IOException("EOF");
}
}
/**
* Прочитать из потока целое число (см. DataInput)
*/
public int readInt() throws IOException {
return (readUnsignedByte() << 24) |
(readUnsignedByte() << 16) |
(readUnsignedByte() << 8) |
(readUnsignedByte());
}
/**
* Прочитать из потока длинное целое число (см. DataInput)
*/
public long readLong() throws IOException {
byte bb[] = new byte[8];
readFully(bb);
return (bb[0] << 24) |
(bb[1] << 16) |
(bb[2] << 8) |
(bb[3]);
}
/**
* Прочитать из потока короткое целое число (см. DataInput)
*/
public short readShort() throws IOException {
return (short) ((readUnsignedByte() << 8) | readUnsignedByte());
}
/**
* Прочитать из потока беззнаковый байт (см. DataInput)
*/
public int readUnsignedByte() throws IOException {
return ((int) readByte()) & 0xFF;
}
/**
* Прочитать из потока беззнаковое короткое целое (см. DataInput)
*/
public int readUnsignedShort() throws IOException {
return ((int) readShort()) & 0xFFFF;
}
/**
* Пропустить len байт (см. DataInput)
*/
public int skipBytes(int len) throws IOException {
return (int) skip(len);
}
/**
* Прочитать из потока строку в UTF-8 в соответствии со
* спецификацией в DataInput (см. DataInput)
*/
public String readUTF() throws IOException, UTFDataFormatException {
String s = "";
int n = readUnsignedShort();
byte b[] = new byte[n];
readFully(b);
return new String(b, 0, b.length, "UTF-8");
}
/** Прочитать из потока символ в кодировке UTF-8 */
public char readCharUTF() throws IOException, UTFDataFormatException {
int b, c, d;
b = read();
if (b == -1) {
return (char) -1;
}
if ((b & 0x80) == 0) {
return (char) b;
} else if ((b & 0xE0) == 0xC0) {
c = read();
if ((c & 0xC0) != 0x80) {
throw new UTFDataFormatException();
}
return (char) (((b & 0x1F) << 6) | (c & 0x3F));
} else if ((b & 0xF0) == 0xE0) {
c = read();
d = read();
if ((c & 0xC0) != 0x80 || (d & 0xC0) != 0x80) {
throw new UTFDataFormatException();
}
return (char) (((b & 0x0F) << 12) | ((c & 0x3F) << 6) | (d & 0x3F));
}
throw new UTFDataFormatException();
}
/** Прочитать из потока символ в кодировке UTF-8 НАЗАД */
public char readCharBackUTF() throws IOException, UTFDataFormatException {
int b, c, d;
d = readBack();
c = readBack();
b = readBack();
if (d == -1) {
return (char) -1;
}
if ((d & 0x80) == 0) {
read();
read();
return (char) d;
} else if ((c & 0xE0) == 0xC0 && (d & 0xC0) == 0x80) {
read();
return (char) (((c & 0x1F) << 6) | (d & 0x3F));
} else if ((b & 0xF0) == 0xE0 && (c & 0xC0) == 0x80 && (d & 0xC0) == 0x80) {
return (char) (((b & 0x0F) << 12) | ((c & 0x3F) << 6) | (d & 0x3F));
}
throw new UTFDataFormatException();
}
/**
* Прочитать из потока максимум count символов в кодировке UTF-8
*/
public String readUTF(int count) throws IOException, UTFDataFormatException {
String s = "";
int i = 0;
int b = 0, c = 0, d = 0;
while (i < count && available() > 0) {
s += readCharUTF();
i++;
}
return s;
}
/**
* Пропустить в потоке максимум count символов в кодировке UTF-8.
* Не очень чётко проверяет соответствие данных кодировке.
*/
public int skipUTF(int count) throws IOException, UTFDataFormatException {
byte b;
int i = 0, r = 0;
while (i < count) {
b = readByte();
if ((b & 0x80) == 0) {
r++;
} else if ((((int) b) & 0xE0) == 0xC0) {
readByte();
r += 2;
} else if ((((int) b) & 0xF0) == 0xE0) {
readShort();
r += 3;
} else {
throw new UTFDataFormatException();
}
i++;
}
return r;
}
/**
* Проверить наличие BOM UTF-8 сигнатуры
*/
public boolean checkBOM() {
try {
if (available() < 3 ||
read() != 0xEF ||
read() != 0xBB ||
read() != 0xBF) {
return false;
}
} catch (IOException iox) {
return false;
}
return true;
}
/**
* Поиск группы байт в массиве buffer
*/
public boolean poisk(byte[] b) {
if (b == null) {
return false;
}
int po = 0;
for (int i = bpos + 1; i < buffer.length; i++) {
po = 0;
if (buffer[i] == b[0]) {
for (int j = 0; j < b.length; j++) { //System.out.println("b "+b[j]);
if (buffer[i + j] == b[j]) {
po += 1;
} else {
break;
}
}
}
if (po == b.length) {
bpos = i;
break;
}
}
if (po > 0) {
return true;
} else {
return false;
}
}
/**
*Заменяем старый редактируемый текст на новый
* @param editStart int - позиция с которой заменить текст
* @param oldlen int - предыдущая длинна текста в байтах
* @param newbyte[] новый текст в байтах
*/
public void zamenitj(int editStart, int oldlen, byte newbyte[]) {
if (oldlen > newbyte.length) {
udalitj(editStart, oldlen - newbyte.length);// Если предыдущая длинна текста больше
} else if (oldlen < newbyte.length) {
dobavitj(editStart, newbyte.length - oldlen);// Если предыдущая длинна текста меньше
}
try {
System.arraycopy(newbyte, 0, buffer, editStart, newbyte.length);
} catch (Exception ex) {
}
}
/**
* Удаление байтов
* @param editStart int - позиция с которой удалить
* @param count int - количество удаляемых байтов
*/
public void udalitj(int editStart, int count) {
try {
byte newbuffer[] = new byte[buffer.length - count];
System.arraycopy(buffer, 0, newbuffer, 0, editStart);
System.arraycopy(buffer, editStart + count, newbuffer, editStart, buffer.length - (editStart + count));
buffer = newbuffer;
newbuffer = null;
} catch (Exception ex) {
}
}
/**
* Добавление байтов
* @param editStart int - позиция с которой добавить
* @param count int - количество добавляемых байтов
*/
public void dobavitj(int editStart, int count) {
try {
byte newbuffer[] = new byte[buffer.length + count];
System.arraycopy(buffer, 0, newbuffer, 0, editStart);
System.arraycopy(buffer, editStart, newbuffer, editStart + count, buffer.length - editStart);
buffer = newbuffer;
newbuffer = null;
} catch (Exception ex) {
}
}
}

View File

@ -0,0 +1,8 @@
package com.vmx;
public interface InputStreamCloser
{
public void close ();
}

View File

@ -0,0 +1,90 @@
package com.vmx;
import java.io.*;
public class InputStreamDecoder
{
int enc;
BufDataInputStream bdis;
/** Конструктор */
public InputStreamDecoder (InputStream is, String enc) throws UnsupportedEncodingException, IOException
{
if (enc.compareTo ("UTF-8") == 0)
this.enc = 1;
else if (enc.compareTo ("windows-1251") == 0)
this.enc = 2;
else
throw new UnsupportedEncodingException ("Encoding " + enc + " is not supported by InputStreamDecoder");
bdis = new BufDataInputStream (2048, is,true);
}
/** Конструктор */
public InputStreamDecoder (BufDataInputStream bdis, String enc) throws UnsupportedEncodingException
{
if (enc.compareTo ("UTF-8") == 0)
this.enc = 1;
else if (enc.compareTo ("windows-1251") == 0)
this.enc = 2;
else
throw new UnsupportedEncodingException ("Encoding " + enc + " is not supported by InputStreamDecoder");
this.bdis = bdis;
}
/** Считать символ */
public char readChar () throws IOException
{
char c = (char)-1;
if (bdis.available () > 0)
{
if (enc == 2)
{
int i = bdis.read();
if (i > -1)
c = StringEncoder.decodeCharCP1251 ((byte)i);
}
else if (enc == 1)
c = bdis.readCharUTF ();
else
throw new IOException ("Internal InputStreamDecoder error");
}
return c;
}
/** Считать строку длиной максимум len */
public String readChars (int len) throws IOException
{
if (bdis.available () <= 0)
return null;
if (enc == 1)
return bdis.readUTF (len);
else if (enc == 2)
{
byte [] bs = new byte [len];
int rl = bdis.read (bs);
return StringEncoder.decodeString (bs, 0, rl, "windows-1251");
}
throw new IOException ("Internal InputStreamDecoder error");
}
/** Считать символ назад */
public char readCharBack () throws IOException
{
if (bdis.tell () <= 0)
return (char)-1;
if (enc == 1)
return bdis.readCharBackUTF ();
else if (enc == 2)
{
int i = bdis.readBack();
if (i == -1)
return (char)-1;
return StringEncoder.decodeCharCP1251 ((byte)i);
}
throw new IOException ("Internal InputStreamDecoder error");
}
/** Пропустить n символов, возвращает число пропущенных байт */
public int skipChars (int n) throws IOException
{
if (enc == 1)
return bdis.skipUTF (n);
else if (enc == 2)
return bdis.skipBytes (n);
throw new IOException ("Internal InputStreamDecoder error");
}
}

View File

@ -0,0 +1,114 @@
package com.vmx;
import java.io.UnsupportedEncodingException;
public class StringEncoder
{
/** Таблица кодировки "windows-1251" */
protected static char cp1251 [] =
{
'\u0410', '\u0411', '\u0412', '\u0413', '\u0414', '\u0415', '\u0416',
'\u0417', '\u0418', '\u0419', '\u041A', '\u041B', '\u041C', '\u041D',
'\u041E', '\u041F', '\u0420', '\u0421', '\u0422', '\u0423', '\u0424',
'\u0425', '\u0426', '\u0427', '\u0428', '\u0429', '\u042A', '\u042B',
'\u042C', '\u042D', '\u042E', '\u042F', '\u0430', '\u0431', '\u0432',
'\u0433', '\u0434', '\u0435', '\u0436', '\u0437', '\u0438', '\u0439',
'\u043A', '\u043B', '\u043C', '\u043D', '\u043E', '\u043F', '\u0440',
'\u0441', '\u0442', '\u0443', '\u0444', '\u0445', '\u0446', '\u0447',
'\u0448', '\u0449', '\u042A', '\u044B', '\u044C', '\u044D', '\u044E',
'\u044F'
};
/** Конструктор. Пустой. */
public StringEncoder ()
{
}
/** Кодировать строку s в кодировку enc */
public static byte [] encodeString (String s, String enc) throws UnsupportedEncodingException
{
byte [] bs;
try
{
bs = s.getBytes (enc);
}
catch (UnsupportedEncodingException x)
{
if (enc.compareTo ("windows-1251") == 0)
{
bs = new byte [s.length ()];
for (int i = 0; i < s.length (); i++)
bs [i] = encodeCharCP1251 (s.charAt (i));
return bs;
}
throw x;
}
return bs;
}
/** Получить длину строки s в байтах в кодировке enc */
public static int getEncodedLength (String s, String enc) throws UnsupportedEncodingException
{
byte [] bs;
try
{
bs = s.getBytes (enc);
return bs.length;
}
catch (UnsupportedEncodingException x)
{
if (enc.compareTo ("windows-1251") == 0)
return s.length ();
throw x;
}
}
/** Декодировать участок массива b длиной len со смещения off из кодировки enc */
public static String decodeString (byte [] bs, int off, int len, String enc) throws UnsupportedEncodingException
{
String s;
try
{
s = new String (bs, off, len, enc);
}
catch (UnsupportedEncodingException x)
{
if (enc.compareTo ("windows-1251") == 0)
{
s = "";
for (int i = 0; i < len; i++)
s += decodeCharCP1251 (bs [off+i]);
return s;
}
throw x;
}
return s;
}
/** Декодировать символ в windows-1251 */
public static char decodeCharCP1251 (byte b)
{
int ich = b & 0xff;
if (ich == 0xb8) // ё
return 0x0451;
else if (ich == 0xa8) // Ё
return 0x0401;
else if (ich >= 0xc0)
return cp1251 [ich-192];
return (char)ich;
}
/** Кодировать символ в windows-1251 */
public static byte encodeCharCP1251 (char ch)
{
if (ch > 0 && ch < 128)
return (byte) ch;
else if (ch == 0x401)
return -88; // Ё
else if (ch == 0x404)
return -86; // Є
else if (ch == 0x407)
return -81; // Ї
else if (ch == 0x451)
return -72; // ё
else if (ch == 0x454)
return -70; // є
else if (ch == 0x457)
return -65; // ї
return (byte)((byte)(ch) + 176);
}
}

BIN
src/res/1.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/res/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
src/res/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
src/res/4.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/res/5.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/res/aow.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
src/res/c1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
src/res/c2.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/res/cs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
src/res/d.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
src/res/diavol.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
src/res/hs.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
src/res/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

BIN
src/res/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/res/logo2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/res/mario.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/res/mia1.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
src/res/mia2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
src/res/nitro.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/res/oboroten.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src/res/red.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
src/res/urban.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
src/res/wolf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

3
src/txt/3DPoolHR.txt Normal file
View File

@ -0,0 +1,3 @@
3D Pool HR
Winner -> Во время игры наберите #*9*9

View File

@ -0,0 +1,3 @@
Dangerous Dave
Êîä àêòèâàöèè ñëåäóþùèõ óðîâíåé - pjin9

15
src/txt/Exit.txt Normal file
View File

@ -0,0 +1,15 @@
Êàëåíäàðü âûõîäà Java èãð!
Age Racers (EA) - íà÷àëî ñåíòÿáðÿ 2009 ã.
Iron Man 2 (GameLoft SA) - 2010 ã.
Sexy Poker 2009 (GameLoft SA) - â 2/3 êâàðòàëå 2009 ã.
Real Football 2010 - Ñåíòÿáðü/Îêòÿáðü 2009 ã.
Tom Clancys's Splinter Cell - Conviction - Àâãóñò/Îêòÿáðü 2009 ã.
Need For Speed : Shift (EA) - Ñåíòÿáðü 2009 ã.
PES 2010 - Îñåíü 2009 ã.
Nitro Street Racing 2 (GameLoft) Èþíü 2009 ã.
Duna: Battle For Arakis (GLU) - Èþíü - Àâãóñò 2009 ã.
Assassin's Creed 2 (GameLoft) - Íîÿáðü 2009 ã.
Ôóòáîëüíûé ìåíåäæåð 2009: ÓÊÐÀÈÍÀ, ÐÎÑÑÈß, ÅÂÐÎÏÀ - Èþëü/Àâãóñò 2009 ã.

6
src/txt/Gradonus.txt Normal file
View File

@ -0,0 +1,6 @@
Gradonus
Для ввода чит-кода выберите Options, потом Cheat Codes
Полное восстановление жизни -> kisember-fullhitpoint
Убийство элементалей с одного каста -> kisember-onemissilekill

View File

@ -0,0 +1,4 @@
Meteos: Astro Blocks
Завершить уровень -> Во время игры наберите #946
Разблокировать все уровни основного режима -> #473

1
src/txt/No.txt Normal file
View File

@ -0,0 +1 @@
В этом месяце раздел отсутствует!

20
src/txt/about.txt Normal file
View File

@ -0,0 +1,20 @@
Мобильный журнал #white JavaМ@НиЯ
#white Программа построена на движке #white aNMPWR
#white Автор программы: #white Виктор aNNiMON Мельник
#white Главный редактор: #white Евгений "PuRe" Мокушев
#white Заместитель главного редактора: #white Максим "Ярэп" Постельга
Заведующий отделом кадров - Максим "Маks15"
#white Журналисты: #white Эд "RGT" Рэгон, Алекс{DeadHead}Кононенко, Владимир "Wally" Красий, Александр N0th1ng Щербинин, Алексей Smoker1 Винокурцев, Данила "D@niсk" .
#white Работа с изображениями: #white Михаил Королев aka "MasterMiha"
#white Wap сайт : #white Андрей And7ei, Станислав Lpzhelud, PuRe
#white Контакты:
#white Главный редактор : pure@java-mania.ru
Заместитель главного редактора: Postel@wapalta.mobi

34
src/txt/aoh.txt Normal file
View File

@ -0,0 +1,34 @@
Привет всем! Наша редакция решила впервые провести викторину на страницах нашего журнала! Викторина будет посвящена серии игр Аgе оf Неrоеs, приз за первое место - семизнак аськи, второе место - восьмизнак.
Итак, правила таковы : есть 30 вопросов, каждый вопрос - 1 балл. Ответы на вопросы вы можете присылать или в личку Рurе (или Ярэп'у), или на е-mаil. Викторина будет проходить до конца сентября. Затем мы подведем итоги, сосчитаем баллы, и обьявим результаты в 4 номере журнала. Ответы нужно присылать в форме : 1) ответ 2) ответ , и т.д.
Вот вопросы :
1) Имя гл. героя в АоН6.
2) Как звали бога орков в АоН3?
3) Из каких частей состоял доспех Хара?
4) Для чего нужен плод дерева висельников в АоН4?
5) За кем охотилась Бьянка?
6) Как звали "древнего" в АоН4?
7) Как зовут эльфа в АоН3, который, по словам Воледара, начал войну?
8) Как зовут дочь Хара?
9) Как назывался город людей в АоН5?
10) Охранник Тиалин в АоН4.
11) Хранитель ключей от врат в АоН2.
12) Название башни, охраняющей Радужную долину.
13) Сколько дней нужно охранять Совет Шаманов от эльфов?
14) Как получить нагрудник Хара?
15) За какую расу мы играем в АоН2?
16) Место обитания богов.
17) Имя сержанта Ракгула.
18) Имя предводителя гоблинов.
19) Сколько всего богов в Пантеоне?
20) Из каких частей состоит печать алхимика в АоН6?
21) Имя человека, похитившего эликсир молодости в АоН6.
22) Назовите имя военачальника эльфов в АоН3.
23) Что нужно сделать в АоН2, чтобы получить ключ Сторка?
24) Назовите имена тех, кто отправился с вами в последний путь в АоН4.
25) Что просит найти древний в АоН4?
26) За кого мы играем в АоН3 (имя) ?
27) Что нужно найти для волшебника в АоН1, чтобы он перенёс нас к замку Князя Тьмы?
28) Сколько ВСЕГО игр в СЕРИИ АоН?
29) Локация гномов в АоН5.
30) Сколько локаций в АоН6?
Р.S. При совпадении балов, победителем считается тот, кто прислал ответы раньше. Всем удачи! :)

1513
src/txt/basic.txt Normal file

File diff suppressed because it is too large Load Diff

42
src/txt/cap.txt Normal file
View File

@ -0,0 +1,42 @@
Название : Captаin Gаlасtiс : Supеr Spасе Неrо
Жанр : аркада
Разраб : Digitаl Сhосоlаtе
Релиз : август 2009
img/res/c1.png
Digital Chocolate выпустила в свет нового героя, хотя множество разработчиков строят игру вокруг всем известного героя, вспомните того-же Человека-Паука или Соника.
И это- проблема - они выпускают игры вокруг характера (торговой марки), а не наоборот пытаются создать нового персонажа. Digitаl Сhосоlаtе приняли намного более разумный подход с Captain Galactic- они имели блестящую идею для игры и изобрели героя, чтобы соответствовать.
Первичная способность капитана- межпланетный полет, хотя он зависит от гравитационных полномочий. Вы начинаете каждый уровень, создавая полет при управлении(беге) вокруг крошечного астероида, с которого Вы начинаете. Зажимание и поддержание кнопки "2" посылают Вас в орбиту, где Вы можете собрать монеты,которые кто-то небрежно оставил. В космосе вас подстерегает множетво противников. Если не будет ничего иного как облететь их, то наш герой прилетит назад к земле в сильном рывке и совершит нападение, разрушая любых злодеев и даже, в некоторых случаях, повреждая планету непосредственно.
Именно, когда есть другая планета в пределах диапазона, вещи становятся интересными. Что можно сказать о графике? Она не идеальна, когда я скачал родную версию для 176х220 я ужаснулся! Да, на небольших экранах графика оставляет желать лучшего, после версии для 320х240 размером в 1.6 мб, которую я скачал раньше родной играть в эту стало не солидно. Из плюсов стоит отметить что DC выпускают мультиэкранные игры и версия от 320х240 пошла у меня как родная. Спецэффекты в 1.6мб версии просто супер, чего только стоит удар с разгона в планету или боссы.
img/res/c2.jpg
Поэтому лучше играть в наибольшую по весу версию. Звуки в игра на высоком уровне, они соотвествуют сюжету и передают атмосферу игры. Captain Galactic выглядит как традиционный платформер, только со строго зажатыми в тиски средствами управления.
В целом, Галактический Капитан из-за непривычной для ява физики, инерции с полетами к которым присоединяется типично превосходное исполнение Digital Chocolate, делает его одной из самых новых мобильных игр в которые стоит поиграть. некоторое время.
Графика : 9
Геймплей : 7
Музыка 10
Управление : 5
Общая оценка : 7
Автор статьи: D@nick

1
src/txt/cheats.txt Normal file
View File

@ -0,0 +1 @@
Уважаемые читатели, если у вас появились новые читы, фишки, подсказки к java играм, вы можете прислать их нам на e-mail : mokushev.evgeniy@rambler.ru

13
src/txt/cobra.txt Normal file
View File

@ -0,0 +1,13 @@
Игра-G.I.Joe The Rise of Cobra
Разработчик-EА
Дата релиза-июль 2009 года.
Игра по мотиву фильма-обречение на крах?
Когда пришло известие,что компания ЕА выпустила игру по мотивам фильма 'Rise of Cobra' я всерьез призадумался,вспомнив о том,что игры по фильмам обычно получаются либо недосказанными(пропущено море сюжетных эпизодов) либо такими,какие вообще качать не хочется.К тому же в памяти был печальный пример игры 'Люди Х:Росомаха',когда к ужасной графике добавился и ужасный игровой процесс.Но я знал,что ЕА не станет терять свою репутацию,заработанную столь тяжёлым трудом и постарается выпустить игру,что называется 'максимально приближенную к аналогу,т.е к фильму'.Но забегая вперёд скажу,что потратил траф на игру зря... Но расскажу обо всём по порядку:Начав игру,мне сразу в голову пришла мысль-о боже,неужели в нашем нынешнем 2009 году ещё возможна столь ужасная графика?Ужаснейшие текстуры,нечётко прорисованные персонажи...Кстати о персонажах,их три-щепетильный и тщедушный с виду человек по грозному кличке 'Duke',здоровенный камрад афроамериканской наружности 'Ripcord' и милая девушка 'Scarllet'.Так о чём это я?Ах да,о графике,такое ощущение,что разработчики работали над ней в спешке,будто забыли дома включенный утюг.Гг.Но всем известно что немаловажной частью хорошей игры является геймплей.Здесь он хорош,нам предстоит вдоволь побегать,попрыгать,посносить бошки надоедливым роботам и в конце доходим в боссов.Хочется отметить,что игра показалась мне необычайно тяжелой.Чего только стоила мне миссия 'Tanker' на которую я потратил немного немало целую ночь(для сравнения-экшн от Лофта как раз и проходятся за одну ночь)Также стоит отметить интересную фишку,придуманую ЕА:начав уровень одним героем мы имеем возможность закончить этот уровень уже совсем другим персом.А вот с оружием разрабы явно поскупились-всего 3 вида,не правда ли скупо?Кстати о вооружении-игра во многом строится на самовостанавливающей функции нашего костюма.Кстати,я так и не понял,почему так медленно ходят наши персы?Не из-за многокилограммовой амуниции ли?Правда имеется возможность ускорения,нажав дважды кнопку движения.В остальном в управлении всё стандартно,единственное,что не понравилось,так это неналичие прыжков по диагонали,а так все норм.При попадании в нас вражеских снарядов наш перс страдальчески вскрикивает.Кстати в опциях мелодию можно оставить,или тока сделать звуковые эффекты,по вашему желанию.
ЕА сделал в принципе неплохую игру,но явно недоработанную.В неё можно поиграть вечером от скуки,не более...
Общая оценка игры:
Графика-5 баллов
Управление-7 баллов
Геймплей-7 баллов
Звук-6 баллов
Общий балл-7.
Автор статьи-Максим Maks15 Машин.

14
src/txt/cops.txt Normal file
View File

@ -0,0 +1,14 @@
Игра-Cops LA Police.
Разработчик-Gameloft SA.
Дата релиза-июль 2009 год.
Узнав новость,что Gameloft собирается выпустить игру 'полицейской' тематики я с горечью подумал,что наверняка будет ощущаться недостаток драйва,т.к наверняка наш коп не сможет палить в прохожих и совершать не вполне законные поступки.Этого в игре и не оказалось,но забегаю вперед скажу вам,дорогие читатели,что и без этого игра получилась на редкость забойной.Но давайте систематизируем мои мысли и расскажем обо всём по порядку...
Лос-Анжелес...В этом городе царит преступность...И тут в напарники к опытному полицейскому Дереку Тёрнеру приходит молодой салага Марк Перез...Помимо этих двух человек мы имеем в наличие опытного детектива Уильяма Райта и координатора Клер Ли.Сюжетная линия продумана до мелочей,уже с первой миссии нам предстоит гоняться за преступниками,попутно выполняя дополнительные задания,такие как например 'найти кота',поиграть в баскетбол,в бейсбол и т.д.
Из оружия мы имеем пистолет и дробовик,к которым позже добавится электрошокер.По геймплею игра представляет собой хороший экшн с элементами квеста.Выполняя свою работу мы поднимаемся по служебной лестнице и в перспективе можем возглавить полицейское управление Лос-Анжелеса!А вообще разработчики радуют большим набором вкусностей:от надевания наручников на руки мерзавцев до управления штурвалом вертолёта!Особо порадовало то,что наконец то разработчики сделали возможным нелинейное развитие событий!Теперь от ваших дипломатических талантов и умения вести переговоры будет зависеть очень многое,как например в ситуациях с определением преступника из круга подозреваемых!В этой игре сломан стереотип,что полицейские-крутые парни,арестовывающие всех и вся и угоняющие любую тачку для 'службы'.Здесь это обычные люди со своими фобиями.И наконец расскажу о фишке,которая меня несказанно порадовала-при определённом развитии сюжета нам предстоит принять участие в дополнительной миссии-преистории,рассказывающей о преступном прошлом Дерека Тёрнера.Скажу коротко о графике и звуке-с первого взляда видно,что игра выполнена на движке игры Heroes of Sparta,то есть играть нам предстоит в двух плоскостях,очень хорошо прорисованы текстуры,правда улыбнул дизайн квартир-диван,телевизор,ванна и туалет в одной комнате-мило,не правда ли?Со звуком дела обстоят не очень-одна мелодия на уровень,это ли мы ожидали от французкого разработчика?Но для особо привередливых посоветуют отключить его совсем,и играть,не испытывая никакого дискомфорта.
Одним словом этой игрой Gameloft в сотый раз доказал что является лучшим разработчиком мобильных игр.
Оценка игры:
Сюжет-9 баллов
Геймплей-10 баллов
Графика-8 баллов
Звук-7 баллов
Общая оценка игры-9 баллов
Автор статьи-Максим Maks15 Машин.

27
src/txt/cschina.txt Normal file
View File

@ -0,0 +1,27 @@
3D Counter Strike China
img/res/cs.png
Великолепное творение от китайских производителей - контер страйк на телефон. Единственный минус игры - китайский язык :) Но впрочем он там и не нужен - и так всё понятно.
Из плюсов:
- Большой набор оружия (от ножа до AWP и одним загадочным оружием которое я так и не смог купить) + Всё купленное оружие можно носить с собой (гы гы, помоему создатели игры переборщили)
- Большой выбор как брони так и дополнительных вещей (каски, штаны, свитера, ботинки, перчатки (меня всегда поражала китайская фантазия :) ))
- Куча увлекательных миссий (убить всех террористов, обезвредить бомбы, спасти заложников и т.д.)
- Возможность боковой ходьбы кнопками 1 и 3
- Имеется карта местности (вызывается кнопкой 0)
Из минусов:
- Вообщем минусов как только китайский язык вроде нету
Игра действительно на высоте и заслуживает внимания. Моя оценка: 9 +

28
src/txt/diamond.txt Normal file
View File

@ -0,0 +1,28 @@
Название : 3D Diamоnd Fеvеr
Жанр : 3D-аркада
Разраб : NGаmеs
Релиз : конец июля 2009
img/res/1.gif
Представляю вам новую игру очень молодой компании NGаmеs (на данный момент выпущены лишь 3 игры, включая 3D Аir Соmbаt и Gоаl 2009). В данной игре мы становимся охотником за алмазами, и чтобы разбогатеть, нам прийдётся спуститься в грубокие шахты на старой вагонетке. К слову отмечу, что вид в игре из этой самой вагонетки. Ну что ж, разберемся, что за фрукт эта компания NGаmеs. Чесно говоря, перед скачиванием я не был уверен в интересности игры, ведь слово Diаmоnd наталкивало на мысли о какой нибудь глупой аркаде или головоломке. Но, любовь к 3D играм и служебный долг обязывали. Первое, что нужно отметить в игре - это ужасную графику. Обьекты и окружение прорисованы очень нечетко, краски сливаются. В общем, я ожидал совсем не такого. Единственный более менее хорошо прорисованый обьект это меню. Но мы же не на меню сюда пришли смотреть! Что ж, пришлось поиграть с тусклой графикой, чтобы иследдовать геймпей игры.
Он тоже не из самых лучших. Сюжета никакого нет. Мы просто будем кататься на нашем "транспорте" по подземельям на протяжении 12 уровней. В игре даже есть 3 босса, они занимают 4, 8, и 12 уровень соответственно. На самом деле гейплей не дышит динамикой. Мы просто ездим, собираем алмазы, стреляем в монстров. Иногда, чтобы развлечься, убиваем боссов. Правда, есть в игре и такая вещь, как развилки. От твоего выбора напрямую будет зависеть, проедешь ли ты дальше, или влетишь в стену. Но карта быстро решает эти вопросы, ведь на ней обозначены все развилки, и не трудно посмотреть, в какую сторону нужно поворачивать. В целом, геймплей такой же скудный, как графика. Немного порадовал звук, но и он далёк от идеала. Во время игры звучат всего 3 не очень длинные мелодии, довольно весёлые, но повторяющиеся на протяжении всей игры. Очень скоро это надоедает, и хочется включить плеер. Я лично так и сделал.
Что касается управления, то оно очень простое. 4,6 - поворот, 2,8 - ускорение/замедление , 5 - стрелять. Вот и всё.
Итог : получилась игра довольно среднего качества. Надеюсь NGаmеs всё исправят в своих будущих играх.
Графика : 4
Геймплей : 4
Музыка : 6
Управление : 10
Общая оценка : 6
Автор статьи : Максим "Ярэп" Постельга.

1
src/txt/doom.txt Normal file
View File

@ -0,0 +1 @@
Уже совсем скоро, все геймеры смогут поиграть в одну из самых ожидаемых игр этого года DOOM 2 RPG! Выход запланирован на следующий квартал этого года.

18
src/txt/doomrpg2.txt Normal file
View File

@ -0,0 +1,18 @@
В конце этого года компания EA Mobile
намерена выпустить продолжение своей
некогда успешной игры Doom RPG. Во
второй части Вы снова оденете форму
бравого десантника и высадитесь на
Марсе, дабы надрать задницы и (или)
иные места инопланетным тварям! Чем
больше будет сражаться игрок (или
выполнять задания), тем больше будет
расти его опыт, и, как следствие, сила и
здоровье. На уровнях можно собирать или
зарабатывать кредитки корпорации UAC, и
потом обменивать их на патроны, аптечки
и другие приятные предметы. Игра Doom 2
RPG также будет выпущена и для
платформы iPhone/iPod Touch, однако ее
выход по-прежнему неизвестен.
Также вы можете просмотреть трейлер из игры на сайте http://na-predele.wen.ru

16
src/txt/dragon.txt Normal file
View File

@ -0,0 +1,16 @@
Название : Drаgоn аnd Drасulа 3D
Разработчик : НеrоСrаft
Жанр : 3D Асtiоn/Приключения
Релиз : 2005
Эта игра является третьей частью серии игр "Дракон и Дракула", и, в отличии от своих предшественников, выполнена в полном 3D. Игра довольно неплохая даже по сегодняшним меркам, что уже говорить про 2005 год! Ведь 2005 год явно не был богат на 3D новинки, в виду недосконального изученния 3D технологий разработчиками игр. Но несмотря на прогресс, в эту игру продолжают играть до сих пор. Что же привлекает к ней геймеров (и хардкорщиков, но об этом позже) ? Конечно же, прежде всего это атмосфера мира Дракона и Дракулы, которой успели проникнутся фанаты этой серии игр в предидущих частях. Задача игры остается та же - управляя драконом, пробратся через все уровни с врагами к коварному Дракуле, и уничтожить супостата (да что ж он никак не умрет то!) . Как и раньше, ваш дракон, по мере прохождения игры будет расти, превратясь к концу игры в большого летающего дракона. Но не всё так просто. На протяжении 15 уровней вам будут мешать его слуги : зомби, рыцари, и летучии мыши. Есле уж зашла тема о сложности, то тут вам предстоит немало попотеть, чтобы пройти игру. Дело в том, что все действия происходят не на земле, а на платформах, которые летают в воздухе. И падать с этих платформ вниз вам предстоит часто. Шаг в сторону - упал, соскользнул с платформы - упал, недопрыгнул до следующей - опять минус жизнь. В общем, на прохождение игры придется потратить немало нервов. Но зато, пройдя игру, будет чем гордится!
Но вернемся к самой игре. Как я говорил, нам предстоит путешествовать по 15 уровням в трех мирах (лес, вулкан, кладбище). Платформы в игре тоже разные : обычные, движущиеся, падающие, ледяные. С игровым процесом вроде разобрались, теперь пару слов о графике.
Графическое оформление игры выполнено на довольно высоком уровне. Все 3D обьекты выполнены хорошо, четко, на них приятно смотреть. Особенно хорошо прорисованы враги. Фоновые картинки тоже хороши, они прекрасно передают атмосферу того мира, в котором вы находитесь. Они не очень яркие, поэтому не режут глаз. Притензий к графике у меня нет.
Музыки в игре немного. Лишь в главном меню звучит хорошая мелодия стиля Средневековья. В игре музыки нет, есть лишь звуки прыжка, хождения и собирания бонусов. Хотя музыка в самой игре, я думаю, смотрелась бы куда лучше.
Управление в игра самое обычное. 2,8 - движение, 4,6 - повороты, 5 - прыжок. 1,3 - шаг влево/вправо. В принципе, нариканий нет, хотя можно было бы немного уменьшить длину шага на кнопках 2,8,1,3 чтобы дракон не вылетал с платформы.
Итог : получилась хорошая, интересная, динамичная игра, НО ОЧЕНЬ сложная. Будем ждать четвёртую часть серии, которая должна выйти в скором времени.
Графика : 9
Гейплей : 7
Музыка : 5
Управление : 8
Общий балл : 7,2
Автор статьи - Максим "Ярэп" Постельга

29
src/txt/dream.txt Normal file
View File

@ -0,0 +1,29 @@
Название : Drеаm Dаy Wеdding 2
Жанр : логика
Разраб : I-Рlаy
Релиз : Август 2009
img/res/d.gif
Игры жанра "найди предмет" не очень популярны на jаvа платформе. Компания I-Рlаy решила исправить это, выпустив игры Drеаm Dаy Wеdding и Drеаm Dаy Wеdding 2. Сегодня мы поговорим о второй части, которая удивительно похожа на своих компьютерных собратьев. Здесь так же даётся картинка, и нужно отыскать конкретные предметы на ней. Это не так просто, как кажется, ведь на это дело дается ограниченое количество времени. Кстати, игра на английском, поэтому, если ваши познания ниже средних, советую использовать словарь. Кроме стандартного поиска предметов на картинке, есть еще игра "найди отличие". Экран делится на две части, и нужно найти отличия между картинками. В игре есть 2 подсказки. При использовании, они показывают местоположение любого не найденого предмета. Количество подсказок можно увеличить, есле во время игры найти на картинке 3 синих птицы.
Теперь немного о графике. В игре размером почти мегабайт никак не могла быть плохая графика. Так оно и есть, в игре яркая, красочная графика, все обьекты, даже мелкие, прекрасно прорисованы. Курсор тоже хорошо нарисован, он в виде руки. Когда нажимаешь 5, рука сжимается.
Музыки в игре немного. Лишь одна мелодия, и она вечно повторяется. После 5 минут игры, я не выдержал, и отключил звук совсем.
Управление в игре, напротив, очень удобное. Курсор движется быстро, плавно, не зависает. В общем, одно удовольствие. 2,4,6,8,1,3,7,9 - управление курсором, 5 - выбор.
Итог : хорошая игра по поиску предметов, но немного сложноватая. Но именно такой и должны быть такие игры! А вот музыка подкачала.
Графика : 10
Геймплей : 8
Музыка : 3
Управление : 10
Общий бал : 8.1
Автор статьи - Максим "Ярэп" Постельга

14
src/txt/egipet.txt Normal file
View File

@ -0,0 +1,14 @@
Приветствую всех читателей нашего журнала. Сегодня мы поговорим о долгожданной игре Египет 3D от компании NЕТ Lizаrd. Конечно, столь великая игра не может быть описана одним человеком, по этому мы решили поработать в команде. Сегодня я расскажу о графике и геймплее игры, а Максим (ник - Маks15) поведает вам всё об управлении и музыке.
Что ж, приступим.
Египет давно приманивал людей своей красотой, загадочностью и неповторимостью. И компанию NЕТ Lizаrd первой решилась на создание игры про Египет. И не какой-то там игры, а настоящего 3D шутера с видом от первого лица! Игра безусловно заслуживает награды "Игра месяца", а то и выше. Но что же привлекает геймеров в этой игре, заставляя засиживатся у телефона, и нажимать на пластиковые прямоугольники с цифрами? Конечно, в первую очередь это графика. Я видел много 3D шутеров, но в плане графики Египет оставляет конкурентов играть в тетрис. Разработчики постарались на славу. Все обьекты в игре, включая стены, пол, потолок, оружие, монстры, всё прорисовано качественно. На стенах красуются всем извесные картины из Древнего Египта, создавая атмосферу погружения в прохладные просторы Египетских пирамид. Оружие прорисовано хорошо, средства вооружения не похожи друг на друга. Что заслуживает особой похвалы, так это монстры. Они выполнены в полном 3D, а есле подойти к ним поближе, и рассмотреть, видно, что они нарисованы очень профиссионально. Графика окружения тоже приятно удивила. Здесь видно, что пол, это действительно пол, а не безформенная серая масса, а потолок, это действительно потолок, а не отражение безформенной серой массы пола. В общем и целом, графика очень красочная и интересная, и она получает оценку 10.
Теперь перейдем к геймплею. В отличии от большинства шутеров, где главной задачей является ходить и стрелять, в этой игре есть сюжет. А начинается всё с того, что вы, с групой археологов отправляетесь в Египет. Но как обычно, всё пошло не так, и вы приходите в себя в пирамиде, видите, что выход завалило, а все ваши коллеги погибли. Теперь вам предстоит найти выход, и отправится домой. А искать выход вы будете на протяжении 17 уровней в пирамиде, и загадочных небесных лабиринтах. На пути к свободе вам предстоит сразится с толпами монстров, и 2 боссами. Монтров в игре не так уж много, и убить их не очень то сложно... но когда они прут на вас всей толпой, невольно начинаешь мечтать о базуке или огнемёте. Убивать тварей одно удовольствие. При убийстве, они разлетаются ошмётками плоти во все стороны (непонятно, откуда у механических уродцев плоть, но это не суть важно). Также порадовали небольшие "видео вставки", например, в начале и в конце игры, и при появлении боссов. Ума не приложу, как столько возможностей всунули в игру, размером меньше 1 MВ! Но вернемся к сюжету. Весь сюжет мы узнаём, по надписям на экране, которые будут появлятся на протяжении всей игры. Диалогов не придусмотрено (да и с кем разговаривать то, не с монстрами же?). В конце игры мы попадаем к некому существу, исполняющему желания (аkа Монолит из Сталкера). Здесь же нам предстоит сделать выбор : вернутся домой, разрушить это место, или найти свое предназначение. Лично меня такой поворот событий очень порадовал, ведь это было впервые, в жанре 3D шутеров, где надо было делать свой собственный выбор! Конечно, интуиция подсказывала мне, что надо было выбрать "вернутся домой", но я перестал бы уважать себя, есле бы не опробовал другие варианты. Сначала я выбрал "Разрушить это место", и конечно же, это место было разрушено. Вместе со мной. Тогда я выбрал "Предназначение". Мой персонаж спросил "Какое моё предназначение?". Ответ меня просто убил. "Ты пакман" - заявило существо, и мигом превратило меня в большое, круглое, желтое существо. Неприятная концовка, не так ли? В конце концов, я вернулся домой. Гейм овер и хеппи энд. Кстати, для значительного продления игрового процесса, в игре есть пункт "Выживание", где вы можете проявить свои силы, пытаясь как можно дольше продержатся против огромных толп монстров! Моя оценка гейплея 10 балов. Благодарю за внимание. А теперь о звуке и управлении вам расскажет Максим.
Маks15:
Звук-10 баллов из 10. Разработчик учёл все пожелания геймеров и поэтому со звуком всё просто замечательно!Уже с первых моментов включения игры нас будоражат великолепные аккорды.Отлично проработано звуковое оформление и во время игрового процесса.Звучит музыка,целиком передающая происходящее на экране,меняющаяся в зависимости от той или иной игровой ситуации.Теперь звук выстрела из пистолета и из автомата-не одно и тоже.Каждому оружию придана своя звуковая гамма.Скажу просто-хочется погромче включить звук,ибо играть с ним-сплошное удовольствие!
Управление-9баллов из 10.По этому показателю все в ажуре.Net Lizard в полной мере учёл все пожелания своих фанатов.Управлять нашим героем-сплошное удовольствие.Сразу стоит отметить,что появилась функция,которой не было ни в одном предыдущем шутере-возможность прицеливания.Нажав * мы получим возможность выносить врагов с дальней дистанции.Еще особо понравилось нововведение,что мы получили возможность наступать на врагов,или попросту говоря,давить их ногами.Еще небольшие сюрпризы,сделанные нам компанией:для владельцев моделей с акселерометром добавлена возможность управления героем с помощью сенсора.Также введена опция изменения резкости управления. В остальном всё стандартно:5-выстрел;1,3-резкий поворот вправо,влево,4,6-обычный поворот:7,9-шаг влево,вправо;2-идти вперед;8-идти назад. Пожалуй единственный недостаток-не слишком удобный прицел. А так все отлично!
Графика : 10
Геймплей : 10
Музыка : 10
Управление : 9
Общая оценка : 9.9
Вывод : Наконец то удалось создать ДЕЙСТВИТЕЛЬНО хорошую и интересную игру в жанре 3D шутер. Наш журнал желает удачи компании NЕТ Lizаrd, и успехов на будущее. А мы будем с нетерпением ждать Египет 2!
Авторы рецензии - Максим "Ярэп" Постельга и Максим "Маks15" Машин

1
src/txt/egypt3d.txt Normal file
View File

@ -0,0 +1 @@
Вышла новая под названием Egypt 3D. Купить её можно на сайте www.netizard.net или же, на контент провайдерах.

52
src/txt/fire.txt Normal file
View File

@ -0,0 +1,52 @@
Название: Fire Emblem: Invasion (Эмблема Огня: Вторжение)
Жанр: SRPG
Разработчик: Gameislive
Год: 2007
img/res/2.png
В наше время не так часто можно увидеть хорошую SRPG, хотя этот жанр является старейшим в игровой индустрии. Его история начинается задолго до появления первых громоздких игровых автоматов. Раньше, в 70х годах, когда ребятки хотели поиграть, они доставали не мобильный телефон или игровую консоль. Они открывали верхний ящик стола и брали оттуда сложенную в четыре раза карту, различные фигурки, небольшой набор карточек и пару игровых кубиков. Кидая кубик, игроки проводили все рассчеты, начиная от радиуса хода и закончивая количеством атакующих очков. Вот в те то времена и зародились первые SRPG. Но сейчас не 70-е, сейчас XXI-ый век и все рассчеты на себя берет микропроцессор вашего мобильника с поддержкой MIDP 2.0))
Ну вот мы и подошли вплотную к игре, чье название указано в самом верху статьи.
Fire Emblem: Invasion - первая в легендарной линейке игр от Gameislive. Это игра, которая полностью захватит Ваше сердце, она заставит Вас потратить кучу нервов и, через неимоверное количество ударов телефона о стену (или голову), дойти наконец до финального десятого уровня. Казалось бы всего десять уровней, но каждый уровень - это история, рассказывающая о страданиях королевства София, о народе, который находится под игом остготов и о стремлении принцессы Ямуны избавить королевство от захватчиков.
Есть несколько моментов, отличающих Fire Emblem: Invasion от последующих частей:
- отсутствуют некоторые предметы, которые появятся в следующих частях линейки.
+ есть предметы, которые исчезнут в дальнейших играх.
- отсутствие разнообразия сюжетных линий, которое появится в игре "Fire Emblem: Liberation"
+ в Fire Emblem: Invasion Вы можете сами решать кем станут герои(кроме героев, чье развитие предусмотрено сюжетом (например: Ямуна)): маг или лучник, рыцарь или воин - решать только Вам.
+ повышение статуса героев происходит по достижении 8-ого и 15-ого уровней(при условии что есть необходимый предмет), а не как в следующих частях игры только на 10-ом уровне.
Из вышесказанного можно сразу сказать, что геймплей в Fire Emblem: Invasion на высоте. Поэтому, даже если Вас настолько достанет трудность уровня и Вы решите забросить игру, Вы все равно рано или поздно (скорее рано) возьметесь за нее вновь.
В графическом плане игра великолепна, как и вся серия Fire Emblem. Звуковое сопровождение также на высоте. Если говорить в общем, то игра стоит того, чтобы ей уделили время и если и не пройти полностью, то хотя бы просто получить от нее колосальное удовольствие. Кстати, я не знаю ни одного человека, кто смог бы пройти финальный уровень и убить главного злодея игры. Но мы же будем стараться?!
P.S. Хотелось бы сказать огромное Спасибо V.P.K за столь качественный перевод игры, также людям с форума сайта wap.fonzo.ru, которые по мере своих сил помогали в переводе.
img/res/3.png
Графика: 8.5
Звук: 7
Геймплей: 9.5
Средняя Оценка: 8.3
Автор статьи: Smoker1

25
src/txt/hard.txt Normal file
View File

@ -0,0 +1,25 @@
DIE HARD 4.0
Жанр:экшен
Разрабочик:Gameloft
Сайт:www.gameloft.com
Розкажу о игре DIE HARD 4.0.
Принцип действа прост до безобразия-всех убью,один останусь.Впрочем,ожидать чего-нибудь глубокого философского от мобильной игронизации последнего <<Крепкого Орешка>> было бы просто глупо.Наш герой,Джон МакЛейн,с упорством танка несется вперед,превращая все живое на своем в кровавую вермишель.Изредка ему встречаются двери,которые нужно разминировать или открыть с помощью простеньких мини-игр.
Сам процес геноцида неверных до ужаса напоминает те же великолепные Splinter Cell и Prinse of Persia на мобильнике.Главгер может весело угощать неприютеля свинцом издалека ( у него имется пистолет и УЗИ) или заарасивать коктейлями Молотова.Ну,и,разумеется,в лучших традициях игр от этого разрабочика он может ломать вражине мозг,прыгнув сверху.В общем,очень весело и увлекательно.
Что уж тут говорирь-игра чертовски красива:Gameloft всегда этим грешил,к его чести будет сказано.Отличная прорисовка и анимация,эффекты-просто пальчики оближешь по локоть.Другое дело,что игра пролетается вуквально за час.Что вовсе не очень хорошо.
На сей пессемитической ноте заканчиваем и оглашаем приговор:DH4.0 однозначно хорошая игра рекомендована для скачки.
VERDICT
ГЕЙМПЛЕЙ:
сплошное убивательство
ГРАФИКА:
не истечи слюнями
ЗВУК
приятный,но не в тему
ИГРАБЕЛЬНОСТЬ
2 раза-потолок
Кто не с нами-тот против нас 8/10
Автор:RA92

21
src/txt/help.txt Normal file
View File

@ -0,0 +1,21 @@
#white Управление в режиме выбора статей:
#white 2,4, Джой вверх, Джой влево - Курсор вверх
6,8, Джой вниз, Джой вправо - Курсор вниз
5, Центр джоя - Выбор статьи / переход в след. подменю
# - Переключение полноэкранного режима
#white Управление в режиме просмотра статей:
#white 2,8 - Переместится на строчку вверх/вниз
4,6 - Переместится на экран вверх/вниз
1,7 - Перейти в начало/конец текста
3,9 - Переключение размера шрифтов
* - Отключить картинки при чтении
след. подменю
# - Переключение полноэкранного режима
#white Управление в режиме просмотра статей:
#white 2,8 - Переместится на строчку вверх/вниз
4,6 - Переместится на экран вверх/вниз
1,7 - Перейти в начало/конец текста
3,9 - Переключение размера шрифтов
* - Отключить картинки при чтении

1
src/txt/let.txt Normal file
View File

@ -0,0 +1 @@
Здесь могли бы быть ваши письма! Пожалуйста пишите вопросы на почту mokushev.evgeniy@rambler.ru или Роstеl@wаpаltа.mоbi

50
src/txt/line.txt Normal file
View File

@ -0,0 +1,50 @@
Название : Linе Ridеr
Жанр : Активные (Асtiоn)
Разраб : In-Fusio
Релиз : сентябрь 2008
img/res/4.gif
"Уникальность этой игры в том, что ты сам рисуешь уровни к ней. А затем откидываешься на спинку кресла и смотришь, как безпечный гонщик на саночках пытается пройти через твой рисунок.
Оригинал для компьютера был создан в сентябре 2006 года. За первые 3 месяца игру скачало 15 миллионов человек! Тысячи из них записали и разместили видео со своими уровнями на YоuТubе.Соm
Заинтересовавшись успехом Linе Ridеr, компания Nintеndо решила выпустить её на своих приставках Wii и DS. Но владельцы мобильных телефонов получили её раньше! "
Именно так мне хочется начать свою статью. Немного истории, так сказать. Но вернёмся же к игре. Жанр "уникальных" игр к моему большому сожалению ничтожно мал. Из "уникальных" игр я могу лишь отметить NОМ, NОМ2, Skеtсhеr, и Linе Ridеr. Они не похожи на другие игры, не сделаны по шаблону, и этим уникальны. Например, в NОМ и NОМ2 нам необходимо на протяжении игры вращать телефон, так как человек будет бежать по всем направлениям экрана, даже вверх ногами. А в Skеtсhеr'е нам необходимо дорисовывать путь бегущему человечку, что бы он мог не упасть, или вовремя перескочить препядствия.
Но наша игра Linе Ridеr особенно уникальна, ведь мы можем дать волю нашей фантазии, и рисовать что угодно, а потом смотреть, как гонщик на саночках будет пытаться проехать наши творения.
В игре присутствуют 2 режима : "Головоломка" и "Создать трэк". В режиме "Головоломка" нам даются различные уровни, с несколькими зарисовками на них, и куча красных палочек, которые надо разбить, проехавшись по ним. Нам предстоит дорисовать уровень так, чтобы гонщик проехал, сбивши все красные палки, и доехал целым и невредимым до финиша. Это не так просто, как кажется. Сдесь можно действительно напрячь мозг, и просидеть несколько часов за решениями головоломок.
Самый главный режим в игре, это, конечно создание трэка. Вы можете рисовать что угодно, используя такие линии, как обычная (не даёт ускорения), ускоряющая (даёт разгон, удобно при подъёмах), обратное ускорение (гонщик начинает двигатся в обратном направлении), разбивающая (при пересечении линии гончиком, она разлетается на куски), финишная (конец трэка), и фоновая (просто линии для фона, гонщик не может по ним проехать).
Также есть стирательная резинка, для удаления ненужных деталей. Все эти инструменты послужат вам для создания уникальных уровней, которые можно сохранить, и показать друзьям. Мне, лично, удавалось нарисовать дом, в который заезджал гонщик, проезджал на второй этаж, затем на крышу, и во двор. В доме была мебель, телевизор, картины. На дворе деревья, забор, и сушилась одежда на верёвке. Так что, как видите, ваша фантазия ничем не ограничивается.
Что касается графики в игре, она примитивна, да и зачем игре такого жанра навороченая графика? Листок в клеточку на фоне, гонщик на саночках - это всё, что нужно для веселья!
Управление в игре самое обычное, удобное и практичное. 4,6,2,8 - перемещение курсора, для рисования. 1,3,7,9 - перемещения по диагонали. *,# - выбор инструментов. 0 - начать трэк. Вот и всё.
О музыке можно просто промолчать. Её в игре не придусмотрено. Только лишь несколько звуков, и то появляющихся редко. Хотя, согласитесь, было бы приятно во время просмотра слышать какую нибудь весёленькую музыку. Ну да ладно.
Итог : разработчикам удалось создать уникальную и единственную в своём роде игру, которая надолго затянет вас!
img/res/5.gif
Графика : 6
Геймплей : 6
Музыка : 1
Управление : 10
Общая оценка : 6
Автор статьи : Максим "Ярэп" Постельга

28
src/txt/mario.txt Normal file
View File

@ -0,0 +1,28 @@
Название : Supеr Маriо Fоrеvеr
Жанр : платформенная
Разраб : некто из Китая
Релиз : август 2009
img/res/mario.png
Старый добрый Марио уже дошел и до китая. Как результат - китайское подобие "марио" с изменённым обликом персонажа. Графика в игре тоже изменилась. Здесь уже нет привычных полей и подземелий, теперь мы путешествуем по каким то подвалам, или чтото такое. Прорисованы они довольно неплохо, но однообразно. Все уровни похожи друг на друга, что, конечно, не очень хорошо. Обьекты в игре довольно хорошо прорисованы, но не идеально. Графики поярче в игре не помешало бы.
Насчет игрового процесса, он не очень увлекателен, ну чуствуется того духа марио, хоть и игра на него похожа. В игре 8 уровней, после прохождения которых игра начинается заново. На пути китайского марио встанут разные соперники, включая куриц, крокодилов, капающего яда, и прочих соперников. В принципе, игра довольно лёгкая, уровень можно пройти, зажав цифру 3.
Насчет музыки мне сказать нечего. Совсем. Или это версия для s40v3 такая, или в игре действительно нет музыки! Для игры такого жанра это большой минус.
Управление в игре стандартное. 4,6 - движение, 1,2,3 - прыжки. 8 (в прыжке) - спрыгнуть вниз, и разбить ящики.
Итог : первый китайский блин по имени Марио вышел комом. Но занять вечерок можно.
Графика : 7
Геймплей : 7
Музыка : 0
Управление : 10
Общая оценка : 6
Автор статьи - Максим "Ярэп" Постельга

45
src/txt/mia.txt Normal file
View File

@ -0,0 +1,45 @@
Игра-Miami Night 2:The City is Yours
Разработчик-Gameloft SA
Платформа-java
Дата релиза-24 июля 2009 года.
img/res/mia1.jpg
Очередной клон или шедевр???
Именно эти мысли посетили меня,когда я узнал о релизе компанией Gameloft своей новой игры.Это продолжение серии игр в этом жанре-симуляторы жизни.Ожидания у меня были двоякие.С одной стороны-серия 'Найтс' хорошо зарекомендовала себя,с другой-использовался старый движок.И вот наконец,к радости всех фанатов,игра вышла.Скачивая её,я предвкушал великолепие,и забегая вперед,скажу,что не был разочарован.Ну а теперь давайте поговорим непосредственно об игре.
Окрыв игру,в глаза сразу бросилось привычное и знакомое до боли оформление меню.Вслед за загрузкой над предложили выбрать пол нашего персонажа,а также подобрать его стайл-выбрать прическу,одежду,трусы в конце концов.)Выбор гардероба очень большой,и это порадовало.И т ут начинается непосредственно само игровое действо.Первое,что мы видим на экране,так это то,что наш персонаж знаменит и чрезвычайно богат,он желанный обьект для всех папараций мира...О мечты,мечты...И как жестока реальность.Тот мир грёз рушится,и мы просыпаемся в полицейском участке,а в реальной жизни мы всего лишь человек,приехавший в Майями помочь своему другу,попавшему за решётку за кражу собаки.После выхода из участка можно идти покорять город.Почти сразу я обнаружил новую фишку,доселе в играх этой компании не использовавшийся-вам будет предложено сфотографироваться(!) на камеру(!!) своего мобильника(!!!).Удивительно,не так ли?Перейдем к сюжету.Он в этой игре вообще хорош,весьма интересен,и что немаловажно,нелинеен.Кстати о разнообразии-вам встретяться ситуации,когда от вашего решения напрямую будет зависеть дальнейшее развитие игры.Нам предоставлена полнейшая свобода действий,мы можем идти куда захотим,делать всё,что душе угодно... Заводите друзей,влюбляйтесь...Хорошо продуманы и детали общения. Если допустим по сюжету вам нужны что-либо узнать от определенного человека,можно пойти разными путями.Можно втереться к нему в доверие,а можно и пригрозить расправой.Как и в прошлых играх серии,наш персонаж имеет различные качества:здоровье,голод,криминал,харизма и т.д.Их можно балансировать как угодно,к примеру,если обворовать собеседника,то повыситься уровень криминала,а если почитать роман,то повысится уровень интелекта.Может быть и такое,что некоторых людей могут не устраивать ваши определенные качества,и они не захотят с вами общаться.Но ни в коем случае не отчаиваетесь,ведь все в ваших руках!!!
Говорить о графике буду немного-графа супер,типичная,ставшая фирменной лофтовской графа.
С управление тоже все довольно просто-цифровые кнопки 1-9 отвечают за передвижение перса,а 5 открывает меню действий.Звуки в игре тоже вполне приемлемы,на протяжении игры нас сопровождает такая приятная,ненавязывающая музыка.Одним словом-хорошо.
img/res/mia2.png
Итак,общая оценка игры:
Геймплей-10 баллов
Графика-9 баллов
Управление-8 баллов
Музыка-9 баллов.
Общая оценка игры- 9 баллов.
Спасибо компании Gameloft за очередную блестящую игру.А нашим дорогим читателям от всего журнала JaVaM@nia и лично от меня хочется пожелать-играйте в виртуальном мире,но не забывайте про настоящий.Всем удачи.Пока.
Автор статьи-Максим Maks15 Машин.

6
src/txt/new.txt Normal file
View File

@ -0,0 +1,6 @@
Ну вот пришел этот день - я стал частью команды Java Mania. Постараюсь приносить только одну пользу :) Если что то пойдет не так - не ругайте, я еще новенький и мало чего тут знаю. Ну ладно... Сегодня мой первый выход и я хочу, что бы его запомнили надолго :) Вот и первое нововведение с моим приходом - раздел "На пределе". В этом разделе мы будем писать про самые горячие новинки java индустрии, будем ежемесячно поддерживать тему "Топ 5 игр" и многое другое.
Если имеется, какой то вопрос именно ко мне - прошу в icq 435-488, либо e-mail slade-x@i.ua
С уважением Ваш Slade-X

19
src/txt/nit2.txt Normal file
View File

@ -0,0 +1,19 @@
Игра-Nitro Street Racing 2.
Разработчик-Gameloft SA
Платформа-Java
img/res/nitro.gif
.2D-гонки,ушедшие в прошлое,или новый виток развития?
Итак,компания Gameloft выпустила вторую часть популярных гонок Nitro Street Racing.(Сразу оговорюсь,что рецензия составлена исходя из версии SE 176:220).Следует отметить,что в отличии от первой части,где были и 2D,и 3D версии,на java платформе вышла только 2D версия,что несомненно огорчило фанатов французской компании.Итак,оценивать этот продукт начнем с графики.Геймлофт всегда создавал игры с отменной графикой,и эта игра не исключение,авто игрока и машины соперников прекрасно прорисованы,что само по себе является плюсом.Графика 9/10. Далее рассмотрим главную составляющую любой игры-геймплей.В Nitro Street Racing 2 он не вызывает нареканий,в игре присутствует 10 транспортных средств,которые можно настроить на свой вкус,благодаря системе тюнинга в игре.Игроку не дадут заскучать постепенно открывающиеся 4 локации,а также многообразие заданий и видов гонок.В игре достойная для данного жанра сюжетная линия,однако после прохождения сюжета играть становится,на мой взгляд,неинтересно,это единственный минус в данной области.Вобщем,геймплей тоже на уровне. 8/10. Следующий сектор-звук в игре.Здесь я буду краток,в игре присутствует довольно энергичная мелодия,характерная для данного жанра и не дающая игроку расслабиться.Озвучка 10/10.- - Управление в игре на первый взгляд,немного неудобное.Однако после нескольких минут прохождения Nitro Street Racing 2,я освоился с управлением и научился полноценно контролировать автомобиль в игре.Однако нашелся небольшой изъян:во время прыжка с трамплина контролировать авто нельзя,что в некоторых ситуациях не кстати.Управление 7/10.Перед нами игра,достойная внимания со стороны моб. геймеров,с затягиваящим геймплеем,посредственным управлением,и качественной графикой. Автор статьи- Максим Man14 Гарев

1
src/txt/r.txt Normal file
View File

@ -0,0 +1 @@
В этом месяце вышла замечательная "энциклопедия" рэпа, под названием Rep BOX! Скачать её можно на сайте www.java-mania.ru

37
src/txt/recomenduem.txt Normal file
View File

@ -0,0 +1,37 @@
Art of War 2: GLOBAL CONFEDERATION
img/res/aow.gif
Пожалуй лучшая RTS на Java! Великолепная графика, потрясающая музыка, хорошее управление, интересный Gameplay. Все это не отвлечет тебя от игры не на минуту. Скачивай игру, и становитесь лучшим генералом Art of War 2 GLOBAL CONFEDERATION!
Скачать игру: http://gear-games.com/wap/?p=c_aow21&=ru
High Speed 3D
img/res/hs.gif
Мир стритрейсинга жесток. Здесь встречают по машине и ценят за скорость. Месть, любовь, преданность, коварство - все сливается воедино и заправляется скоростью и шумом мощных моторов.
Скачать игру: http://wap.herocraft.com

16
src/txt/reda.txt Normal file
View File

@ -0,0 +1,16 @@
img/res/red.jpg
Здравствуйте уважаемые читатели журнала о мобильных играх JavaM@NiA! За месяц в плане разработки журнала мы продвинулись на шаг вперед. Как я уже обещал на одном из сайтов, что этот месяц будет месяцам перемен, и это случилось! У нас обновился wap сайт, который доступен по адресу http://java-mania.ru Так же, вся наша редакцию благодарит того человека, благодаря которому J2ME версия журнала идет нормально почти на всех моделях телефонов. Теперь перейдем к содержанию номера! В этом номере вы так же прочтете наши обзоры игр, свежие новости, читы, и многое другое! Внимание: у нашей редакции обновились почтовые ящики : Главный редактор: pure@java-mania.ru ; Почта для писем, пожеланий и вопросов : support@java-mania.ru На этом у меня все. До скорых встреч на страницах журнала о мобильных играх JavaM@NiA!

16
src/txt/redbull.txt Normal file
View File

@ -0,0 +1,16 @@
Название : Rеd Вull Soаpbох Rасе
Разраб : НаndyGаmеs
Жанр : гонка/аркада
Релиз : август 2009
Словосочетание Rеd Вull в названии игры сразу подсказало мне, что в игре будет скорость и драйв. Но нет, это вовсе не гонка с реалистичной графикой и физикой, а веселая гонка с элементами аркады. О чем же собственно игра? В ней мы будем принимать участие в гонках в различных странах, на весьма необычных машинах. Дело в том, что машины в игре будут создаватся из всего, что попадется под руку. Например, корпус можно сделать из бочки, бревна, огромного ботинка, и т.п., а колеса из тарелок, дисков... В общем такие вот диковинные средства передвижения у нас.
Игровой процесс однообразен на протяжении всей игры. Нам снова и снова прийдется принимать участие в заездах (меняются лишь страны, после каждых 3 туров). Соперников также не придусмотрено. Чтобы заработать медали, нужно доехать до финиша живим так быстро, как сможешь, попутно собирая разбросанные по трассе синие флажки. Всего в игре 7 стран, в каждой из которых 3 заезда. Разбавляет однообразные гонки одна мини игра. Её суть вот в чем : стоят человечки, под каждым из них соответствующая цифра (2,4,6,8), и танцуют под музыку (о музыке расскажу чуть позже). Нам нужно внимательно следить за ними, и как только кто то из них собьется с ритма, нажимать нужную кнопку. Чесно говоря, не понимаю, какое отношение эти танцы имеют к гонкам, но вроде от правильности твоего управления групой зависит количество бонусных очков. Кстати говоря, по мере путешествия по разным странам, облик человечков будет менятся. Но вернемся к самой гонке. Вид в игре от первого лица ( но не из кабины, это же не 3D). По мере прохождения игры будут открыватся новые детали для создания своей "машины".
Графика как для игры такого рода, очень красочная. На фоне можно видеть картинки, отображающие, в какой стране проходит гонка. Также в игре много анимации. Она яркая, красочная, и прорисована хорошо : движение машины, прыжки, танцы людей, публика, разлетающиеся во все стороны стоги сена и защитные колпаки... В общем, в игре чуствуется драйв. Эх, были бы соперники...
Что до музыки, её в игре много, она разная для каждого события : меню, выбор машины, танец, гонка, награждение, и т.д. Во время танцев звучит забавная музыка, наблюдать за человечками, танцующими в такт интересно. Музыка передает то, что происходит на экране. Во время гонки другая музыка, не менее веселая. Хотя хотелось бы что нибудь подинамичней, или, хотя бы звук мотора...
Пару слов об управлении. Оно очень простое. 2,4,6,8 для танца, и 6,4 для поворота в гонке. Вот и всё.
Итог : получилась весёлая и динамичная игра, которая увлечёт вас на некоторое время.
Графика : 8
Геймплей : 6
Музыка : 9
Управление : 10
Общий балл : 8.2
Автор статьи : Максим "Ярэп" Постельга

43
src/txt/true.txt Normal file
View File

@ -0,0 +1,43 @@
Название : Тruе Fighting 3D
Жанр : 3D драки
Разраб : [][][][][]
Релиз : Август 2009
Перевод на русский : RОМZЕS
img/res/diavol.gif
Вот наконецто была переведена (и взломана) игра, которую лично я долго ждал : Тruе Fighting 3D. Игра предстовляет собой хороший 3D файтинг от китайских разработчиков.
Графика в игре довольно хорошая. Правда окружение прорисовано немного смазано, но хотя бы есть несколько видов арен, которые отличаются друг от друга. Воины прорисованы получше (их 5 штук). Спецэффекты также яркие и динамичные, удары хорошо анимированы. Пол прорисован немного смазано. В общем, к графике у меня притензий нет, хотя могла быть и получше.
Геймплей. В игре есть 3 режима : аркада (обучится и отточить навыки), арена (чемпионат из 22 боев, сложность увеличивается по мере прохождения), и игра по Вluеtооth (один на один с другим игроком). Как я говорил раньше, в игре 5 персонажей. Они отличаются внешним видом и способностями. Также есть множество ударов и комбо. Не может не радовать режим по bt. Теперь можно устраивать битвы с своими друзьями. Процесс битвы довольно интересен, у соперников неплохой интелект, победить бывает довольно непросто. После каждого боя идет повтор последних моментов, что, довольно неплохо. Конечно, персонажей можно было сделать побольше, ну ладно.
Музыка. В игре присутствует всего 1 мелодия, которая вечно повторяется. Это не очень хорошо, конечно, но в принципе терпимо. Хотя музыка могла быть и подинамичней.
Управление в игре довольно удобное. 2, 8 - движение по кругу, 4, 6 - движение вперёд/назад, 5 - удар, 7 - аперкот, 9 - суперудар. Комбинации клавиш образуют комбо.
img/res/oboroten.gif
Итог : первые 3D драки из Китая получились довольно неплохие, будем ждать еще проектов.
Графика : 8
Геймплей : 8
Музыка : 6
Управление : 9
Общая оценка : 7.9
Автор статьи - Максим "Ярэп" Постельга

26
src/txt/urbanattack.txt Normal file
View File

@ -0,0 +1,26 @@
Urban Attack
img/res/urban.png
В этой новой стрелялке тебе предстоит
биться на охваченных гражданской войной
городских улицах! В поисках ответа на вопрос,
кто ты есть на самом деле, тебе придется
стрелять, отражать яростные атаки противников
и боссов и решать головоломные задачки. И
впервые на мобильнике снайперская стрельба
в реальном времени! Погрузись в уникальный
графический 3D мир, усиливающей
футуристический эффект этой увлекательной игры!

8
src/txt/vazno.txt Normal file
View File

@ -0,0 +1,8 @@
Важно!
За достоверенность рекламной информации ответственность несем не мы, а рекламодатели. Рекламные материалы нами не редактируются и не корректируются.
Некоторые новости были перепечатаны с сайта games-review.ru
Мнение авторов может не совпадать с мнением редакции.
При любом использовании материалов взятых с нашего журнала, ссылка на наш журнал или на наш сайт строго обязательна!

27
src/txt/wolf.txt Normal file
View File

@ -0,0 +1,27 @@
Wolfenstein RPG
img/res/wolf.png
После огромного успеха Doom RPG, Electronic Arts решили сделать что нибудь похоже но получше... И у них это действительно получилось! Встречайте на страницах нашего журнала Wolfenstein RPG
Вы B.J. Blazkowicz командир элитного отряда США, который должен проникнуть в замок Wolfenstein. Вы должны остановить Ось и спасти мир!
Особенности игры:
- Используйте все ваши умения, чтобы выжить на протяжении 9 уникальных уровней.
- Сразитесь с 32 типами врагов, включая суперсолдат, элитную охрану и зомби.
- Арсенал из 17 видов обычного и паранормального оружия.
- Найдите секреты, сокровища и другие скрытые вещи.
- Получите медали или пункты опыта за хорошо проделанную работу.
- Читайте книги - они помогут улучшить ваши способности
- Проверьте свои умения в 2 мини-играх: "War" и "Kick the Chicken"

1
src/xml/aoh.al Normal file
View File

@ -0,0 +1 @@
Mobile Âàsiñ - /txt/basic.txt

4
src/xml/chts.al Normal file
View File

@ -0,0 +1,4 @@
Gradonus - /txt/Gradonus.txt
3D Pool HR - /txt/3DPoolHR.txt
Dangerous Dave - /txt/DangerousDave.txt
Meteos: Astro Blocks - /txt/MeteosAstroBlocks.txt

0
src/xml/inter.al Normal file
View File

10
src/xml/main.al Normal file
View File

@ -0,0 +1,10 @@
Îò ðåäàêòîðà - redaktor.al
Íà ïðåäåëå - predel.al
Íîâîñòè ìîáèëüíîé èíäóñòðèè - news.al
Âåðäèêò (äîæäàëèñü) - rec.al
Ñåêðåòû - chts.al
Ìîääèíã - mod.al
Ïðåâüþ - /txt/No.txt
Èíòåðâüþ - /txt/No.txt
Ïèñüìà - /txt/let.txt
Ðàçíîå - other.al

1
src/xml/mod.al Normal file
View File

@ -0,0 +1 @@
Mobile Âàsiñ - /txt/basic.txt

3
src/xml/news.al Normal file
View File

@ -0,0 +1,3 @@
DOOM 2 RPG - /txt/doom.txt
Rep BOX - /txt/r.txt
Egypt 3D - /txt/egypt3d.txt

2
src/xml/other.al Normal file
View File

@ -0,0 +1,2 @@
Календарь выхода Java игр - /txt/Exit.txt
JavaМ@НиЯ Рекомендует - /txt/recomenduem.txt

5
src/xml/predel.al Normal file
View File

@ -0,0 +1,5 @@
Î ðàçäåëå - /txt/new.txt
Doîm 2 - /txt/doomrpg2.txt
ÑS Ñhinà - /txt/cschina.txt
Urbàn Àttàñk - /txt/urbanattack.txt
Wolfånståin RÐG - /txt/wolf.txt

15
src/xml/rec.al Normal file
View File

@ -0,0 +1,15 @@
G.I.Joe Rise of Cobra - /txt/cobra.txt
Cops LA Police - /txt/cops.txt
3D Diamond Fever - /txt/diamond.txt
Dragon and Dracula 3D - /txt/dragon.txt
Dream Day Wedding 2 - /txt/dream.txt
Egypt 3D - /txt/egipet.txt
Fire Emblem Invasion - /txt/fire.txt
Die Hard 4 - /txt/hard.txt
Line Rider - /txt/line.txt
Miami Nights : The city is yours - /txt/mia.txt
Nitro Street Racing 2 - /txt/nit2.txt
Red Bull Soapbox Race - /txt/redbull.txt
Super Mario Forever - /txt/mario.txt
True Fighting 3D - /txt/true.txt
Captain Galactic : Super Space Hero - /txt/cap.txt

2
src/xml/redaktor.al Normal file
View File

@ -0,0 +1,2 @@
От редактора - /txt/reda.txt
Важно! - /txt/vazno.txt

10
src/xml/skin.ini Normal file
View File

@ -0,0 +1,10 @@
Цвет основного верхнего градиента - 333531
Цвет основного нижнего градиента - 4b403f
Цвет верхнего градиента курсора - eb8a71
Цвет нижнего градиента курсора - b22e0a
Осветление фоновой картинки - ^150
Цвет заголовков и софт - d8e4f8
Цвет показа времени - FFFFFF
Цвет текста в меню - F0F0F0
Цвет выбранного текста в меню - 003dac
Цвет при просмотре текста - F0F0F0