/*
* Copyright 2015 Daniel Dittmar
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package dan.dit.whatsthat.riddle.games;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Shader;
import android.support.annotation.NonNull;
import android.view.MotionEvent;
import dan.dit.whatsthat.R;
import dan.dit.whatsthat.image.Image;
import dan.dit.whatsthat.riddle.Riddle;
import dan.dit.whatsthat.riddle.RiddleConfig;
import dan.dit.whatsthat.riddle.control.RiddleGame;
import dan.dit.whatsthat.util.general.PercentProgressListener;
import dan.dit.whatsthat.util.flatworld.collision.GeneralHitboxCollider;
import dan.dit.whatsthat.util.flatworld.collision.Hitbox;
import dan.dit.whatsthat.util.flatworld.look.Look;
import dan.dit.whatsthat.util.flatworld.mover.HitboxMover;
import dan.dit.whatsthat.util.flatworld.world.Actor;
import dan.dit.whatsthat.util.flatworld.world.FlatRectWorld;
import dan.dit.whatsthat.util.flatworld.world.FlatWorld;
import dan.dit.whatsthat.util.flatworld.world.FlatWorldCallback;
import dan.dit.whatsthat.util.image.ImageUtil;
/**
* Idea: Spawn random not burning torch somewhere. Task is to bring fire to the torch by moving
* finger from the start mother torch to that torch. Moving too fast (take care of dpi) or touching
* some trap (wind, water) clears the moved fire and maybe some burning torches nearby. Burning torches reveal
* underlying image. Traps need to be remembered as they stay at the same position. No traps directly
* near a torch. Getting mother fire creates a trap, lighting a torch clears one!? (how to prevent unsolvable
* trap inflation)?
* Unlock: Burning torches can be made burning stronger.
* Created by Fabian on 03.08.2015.
*/
public class RiddleTorchlight extends RiddleGame implements FlatWorldCallback {
private static final int HIDDEN_COLOR = Color.BLACK;
private static final long DRAW_ON_MOVE_PAUSE_TIME = 50; //ms
private static final float GLOW_RADIUS = 90.f;
private int mTouchX;
private int mTouchY;
private Bitmap mFlame;
private Paint mBasePaint;
private Paint mGlowPaint;
private long mLastTimeMoveDrawn;
private Paint mGlowToDarkPaint;
private Bitmap mTorchlightEffect;
private FlatWorld mWorld;
public RiddleTorchlight(Riddle riddle, Image image, Bitmap bitmap, Resources res, RiddleConfig config, PercentProgressListener listener) {
super(riddle, image, bitmap, res, config, listener);
}
@Override
protected void initAchievementData() {
}
@Override
public void draw(Canvas canvas) {
canvas.drawPaint(mBasePaint);
canvas.drawCircle(mTouchX, mTouchY, GLOW_RADIUS, mGlowPaint);
canvas.drawBitmap(mTorchlightEffect, mTouchX - mTorchlightEffect.getWidth() / 2 - 2, mTouchY - mTorchlightEffect.getHeight() / 2 - 2, mGlowToDarkPaint);
canvas.drawBitmap(mFlame, mTouchX - mFlame.getWidth() / 2, mTouchY - mFlame.getHeight() / 2, null);
}
@Override
public boolean requiresPeriodicEvent() {
return true;
}
@Override
public void onPeriodicEvent(long updatePeriod) {
mWorld.update(updatePeriod);
}
@Override
protected void initBitmap(Resources res, PercentProgressListener listener) {
mTouchX = mConfig.mWidth / 2;
mTouchY = mConfig.mHeight / 2;
mBasePaint = new Paint();
mBasePaint.setColor(HIDDEN_COLOR);
mGlowPaint = new Paint();
mGlowPaint.setShader(new BitmapShader(mBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
mGlowToDarkPaint = new Paint();
mTorchlightEffect = ImageUtil.loadBitmap(res, R.drawable.torchlight_effect, (int) (GLOW_RADIUS * 2) + 5, (int) (GLOW_RADIUS * 2) + 5, true);
mGlowToDarkPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN));
mFlame = ImageUtil.loadBitmap(res, R.drawable.lagerfeuer,mBitmap.getWidth()/5,mBitmap.getHeight()/5,false);
initWorld(res);
}
private void initWorld(Resources res) {
mWorld = new FlatRectWorld(new RectF(0, 0, mConfig.mWidth, mConfig.mHeight), new GeneralHitboxCollider(), this);
}
@Override
public boolean onMotionEvent(MotionEvent event) {
mTouchX = (int) event.getX();
mTouchY = (int) event.getY();
if (event.getActionMasked() == MotionEvent.ACTION_DOWN || event.getActionMasked() == MotionEvent.ACTION_UP) {
return true;
} else if (event.getActionMasked() == MotionEvent.ACTION_MOVE){
long currentTime = System.currentTimeMillis();
if (currentTime - mLastTimeMoveDrawn > DRAW_ON_MOVE_PAUSE_TIME){
mLastTimeMoveDrawn = currentTime;
return true;
}else {
return false;
}
}
return false;
}
@NonNull
@Override
protected String compactCurrentState() {
return "";
}
@Override
public void onReachedEndOfWorld(Actor columbus, float x, float y, int borderFlags) {
}
@Override
public void onLeftWorld(Actor jesus, int borderFlags) {
}
@Override
public void onMoverStateChange(Actor actor) {
}
@Override
public void onCollision(Actor colliding1, Actor colliding2) {
}
private class Torch extends Actor {
public Torch(Hitbox hitbox, HitboxMover mover, Look defaultLook) {
super(hitbox, mover, defaultLook);
}
}
}